#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
P110-TAPO-TEST - Speziell für TP-Link Tapo P110-Steckdosen
Testet verschiedene Versionen des PyP100-Moduls
"""

import sys
import time
import socket
import subprocess
from datetime import datetime

# Anmeldedaten
TAPO_USERNAME = "till.tomczak@mercedes-benz.com"
TAPO_PASSWORD = "744563017196"

# Standard-IP-Adressen zum Testen (anpassen an tatsächliche IPs)
TEST_IPS = [
    "192.168.0.103",  # Diese IPs waren erreichbar im vorherigen Test
    "192.168.0.104"
]

def log(message):
    """Logge eine Nachricht mit Zeitstempel"""
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print(f"[{timestamp}] {message}")

def check_connection(ip, port=80, timeout=1):
    """Prüft eine TCP-Verbindung"""
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(timeout)
        result = sock.connect_ex((ip, port))
        sock.close()
        return result == 0
    except:
        return False

def install_package(package):
    """Installiert ein Python-Paket"""
    try:
        log(f"Installiere {package}...")
        subprocess.run([sys.executable, "-m", "pip", "install", package, "--force-reinstall"], check=True)
        log(f"✅ {package} erfolgreich installiert")
        return True
    except Exception as e:
        log(f"❌ Fehler bei Installation von {package}: {e}")
        return False

def test_p110_connection():
    """Testet verschiedene Möglichkeiten, um mit P110-Steckdosen zu kommunizieren"""
    
    log("🚀 TAPO P110 TEST - STARTER")
    log(f"👤 Benutzername: {TAPO_USERNAME}")
    log(f"🔑 Passwort: {TAPO_PASSWORD}")
    
    # Verfügbare Module testen
    log("\n1️⃣ SCHRITT 1: Teste verfügbare Module")
    
    try:
        from PyP100 import PyP110
        log("✅ PyP100 Modul gefunden")
    except ImportError:
        log("❌ PyP100 Modul nicht gefunden")
        install_package("PyP100==0.1.2")
        
        try:
            from PyP100 import PyP110
            log("✅ PyP100 Modul jetzt installiert")
        except ImportError:
            log("❌ Konnte PyP100 nicht importieren")
            return
    
    # Erreichbare Steckdosen finden
    log("\n2️⃣ SCHRITT 2: Suche erreichbare IPs")
    
    available_ips = []
    for ip in TEST_IPS:
        if check_connection(ip):
            log(f"✅ IP {ip} ist erreichbar")
            available_ips.append(ip)
        else:
            log(f"❌ IP {ip} nicht erreichbar")
    
    if not available_ips:
        log("❌ Keine erreichbaren IPs gefunden!")
        return
    
    # P110-Verbindung testen
    log("\n3️⃣ SCHRITT 3: Teste PyP100 Bibliothek")
    
    for ip in available_ips:
        try:
            log(f"🔄 Verbinde zu Steckdose {ip} mit PyP100.PyP110...")
            
            # Neue Instanz erstellen
            from PyP100 import PyP110
            p110 = PyP110.P110(ip, TAPO_USERNAME, TAPO_PASSWORD)
            
            # Handshake und Login
            log("   Handshake...")
            p110.handshake()
            log("   Login...")
            p110.login()
            
            # Geräteinformationen abrufen
            log("   Geräteinformationen abrufen...")
            device_info = p110.getDeviceInfo()
            
            # Erfolg!
            log(f"✅ ERFOLG! Steckdose {ip} gefunden")
            log(f"   Name: {device_info.get('nickname', 'Unbekannt')}")
            log(f"   Status: {'Eingeschaltet' if device_info.get('device_on', False) else 'Ausgeschaltet'}")
            
            # Ein-/Ausschalten testen
            if "--toggle" in sys.argv:
                current_state = device_info.get('device_on', False)
                
                if current_state:
                    log("   Schalte AUS...")
                    p110.turnOff()
                else:
                    log("   Schalte EIN...")
                    p110.turnOn()
                    
                time.sleep(1)
                
                # Status prüfen
                device_info = p110.getDeviceInfo()
                new_state = device_info.get('device_on', False)
                log(f"   Neuer Status: {'Eingeschaltet' if new_state else 'Ausgeschaltet'}")
            
            return True
            
        except Exception as e:
            log(f"❌ Fehler bei Verbindung zu {ip}: {e}")
    
    # Alternative Bibliothek testen
    log("\n4️⃣ SCHRITT 4: Teste PyP100 mit alternativer Version")
    
    if install_package("pytapo==1.1.2"):
        try:
            import pytapo
            from pytapo.tapo import Tapo
            
            for ip in available_ips:
                try:
                    log(f"🔄 Verbinde zu Steckdose {ip} mit pytapo...")
                    
                    # Neue Verbindung
                    tapo = Tapo(ip, TAPO_USERNAME, TAPO_PASSWORD)
                    
                    # Geräteinformationen abrufen
                    device_info = tapo.get_device_info()
                    
                    # Erfolg!
                    log(f"✅ ERFOLG mit pytapo! Steckdose {ip} gefunden")
                    log(f"   Name: {device_info.get('nickname', 'Unbekannt')}")
                    
                    return True
                    
                except Exception as e:
                    log(f"❌ Fehler bei pytapo-Verbindung zu {ip}: {e}")
        except Exception as e:
            log(f"❌ Fehler beim Import von pytapo: {e}")
    
    log("\n❌ Keine funktionierenden Tapo-Steckdosen gefunden!")
    log("Bitte überprüfen Sie die Anmeldedaten und IP-Adressen")

if __name__ == "__main__":
    print("\n======= TAPO P110 TEST =======\n")
    test_p110_connection()
    print("\n======= TEST BEENDET =======\n") 