#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Test-Skript für Button-Funktionalitäten
Testet alle Buttons aus dem Selenium-Test auf echte Funktionalität
"""

import requests
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class ButtonFunctionalityTester:
    def __init__(self, base_url="http://127.0.0.1:5000"):
        self.base_url = base_url
        self.session = requests.Session()
        self.driver = None
        
    def setup_driver(self):
        """Selenium WebDriver einrichten"""
        try:
            self.driver = webdriver.Chrome()
            self.driver.set_window_size(1696, 1066)
            print("✅ WebDriver erfolgreich initialisiert")
        except Exception as e:
            print(f"❌ Fehler beim Initialisieren des WebDrivers: {e}")
            
    def login(self, username="admin", password="admin"):
        """Anmeldung durchführen"""
        try:
            self.driver.get(f"{self.base_url}/auth/login")
            
            # Warten bis Login-Formular geladen ist
            username_field = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.NAME, "username"))
            )
            
            username_field.send_keys(username)
            self.driver.find_element(By.NAME, "password").send_keys(password)
            self.driver.find_element(By.XPATH, "//button[@type='submit']").click()
            
            # Warten bis Dashboard geladen ist
            WebDriverWait(self.driver, 10).until(
                EC.url_contains("/dashboard")
            )
            
            print("✅ Erfolgreich angemeldet")
            return True
        except Exception as e:
            print(f"❌ Fehler bei der Anmeldung: {e}")
            return False
    
    def test_button_functionality(self, button_selector, button_name, expected_action=""):
        """Teste einen einzelnen Button auf Funktionalität"""
        try:
            print(f"\n🔍 Teste Button: {button_name} ({button_selector})")
            
            # Button finden
            button = WebDriverWait(self.driver, 5).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, button_selector))
            )
            
            # Ursprünglichen Zustand erfassen
            original_url = self.driver.current_url
            original_text = button.text if button.text else "Kein Text"
            
            print(f"   📍 Button gefunden: '{original_text}'")
            
            # Button klicken
            button.click()
            print(f"   👆 Button geklickt")
            
            # Kurz warten für Reaktion
            time.sleep(1)
            
            # Reaktion prüfen
            reactions = []
            
            # URL-Änderung prüfen
            if self.driver.current_url != original_url:
                reactions.append(f"URL-Änderung: {self.driver.current_url}")
            
            # Modal-Fenster prüfen
            try:
                modal = self.driver.find_element(By.CSS_SELECTOR, ".fixed.inset-0")
                if modal.is_displayed():
                    reactions.append("Modal-Fenster geöffnet")
            except:
                pass
                
            # Loading-Spinner prüfen
            try:
                spinner = self.driver.find_element(By.CSS_SELECTOR, ".animate-spin")
                if spinner.is_displayed():
                    reactions.append("Loading-Animation aktiv")
            except:
                pass
            
            # Toast-Benachrichtigung prüfen
            try:
                toast = self.driver.find_element(By.CSS_SELECTOR, ".fixed.top-4.right-4")
                if toast.is_displayed():
                    reactions.append(f"Toast-Nachricht: {toast.text}")
            except:
                pass
            
            # Button-Text-Änderung prüfen
            new_text = button.text if button.text else "Kein Text"
            if new_text != original_text:
                reactions.append(f"Text-Änderung: '{original_text}' → '{new_text}'")
            
            # Ergebnis ausgeben
            if reactions:
                print(f"   ✅ Reaktionen gefunden:")
                for reaction in reactions:
                    print(f"      - {reaction}")
                return True
            else:
                print(f"   ⚠️  Keine sichtbare Reaktion erkannt")
                return False
                
        except Exception as e:
            print(f"   ❌ Fehler beim Testen: {e}")
            return False
    
    def test_all_buttons(self):
        """Teste alle Buttons aus dem Selenium-Test"""
        if not self.setup_driver():
            return
            
        if not self.login():
            return
        
        # Button-Test-Plan basierend auf Selenium-Test
        button_tests = [
            # Dashboard-Seite (Startseite)
            {
                "page": f"{self.base_url}/",
                "buttons": [
                    (".mb-8 > .btn-primary", "Haupt-CTA Button"),
                    (".btn-primary > span", "CTA Button Span")
                ]
            },
            
            # Dashboard-Seite
            {
                "page": f"{self.base_url}/dashboard", 
                "buttons": [
                    ("#refreshDashboard > span", "Dashboard Aktualisieren")
                ]
            },
            
            # Drucker-Seite
            {
                "page": f"{self.base_url}/printers",
                "buttons": [
                    ("#refresh-button > span", "Drucker Aktualisieren"),
                    ("#maintenance-toggle > span", "Wartungsmodus Toggle")
                ]
            },
            
            # Jobs-Seite  
            {
                "page": f"{self.base_url}/jobs",
                "buttons": [
                    ("#batch-toggle > span", "Mehrfachauswahl Toggle"),
                    ("#refresh-button > span", "Jobs Aktualisieren")
                ]
            },
            
            # Admin-Seite
            {
                "page": f"{self.base_url}/admin",
                "buttons": [
                    ("#analytics-btn", "Analytics Button"),
                    ("#maintenance-btn", "Wartung Button"), 
                    ("#system-status-btn", "System Status Button"),
                    ("#add-user-btn", "Benutzer hinzufügen")
                ]
            }
        ]
        
        results = {"total": 0, "working": 0, "broken": 0}
        
        print("🚀 Starte umfassenden Button-Funktionalitäts-Test...\n")
        
        for test_group in button_tests:
            print(f"📄 Navigiere zu Seite: {test_group['page']}")
            
            try:
                self.driver.get(test_group["page"])
                time.sleep(2)  # Seite laden lassen
                
                for selector, name in test_group["buttons"]:
                    results["total"] += 1
                    if self.test_button_functionality(selector, name):
                        results["working"] += 1
                    else:
                        results["broken"] += 1
                        
            except Exception as e:
                print(f"❌ Fehler beim Laden der Seite {test_group['page']}: {e}")
        
        # Zusammenfassung
        print(f"\n{'='*60}")
        print(f"📊 TEST-ZUSAMMENFASSUNG")
        print(f"{'='*60}")
        print(f"Getestete Buttons gesamt: {results['total']}")
        print(f"✅ Funktional:          {results['working']}")
        print(f"❌ Nicht funktional:    {results['broken']}")
        
        success_rate = (results['working'] / results['total']) * 100 if results['total'] > 0 else 0
        print(f"📈 Erfolgsrate:         {success_rate:.1f}%")
        
        if success_rate >= 90:
            print("🎉 AUSGEZEICHNET! Fast alle Buttons funktionieren korrekt.")
        elif success_rate >= 75:
            print("✅ GUT! Die meisten Buttons funktionieren korrekt.")
        elif success_rate >= 50:
            print("⚠️  BEFRIEDIGEND! Einige Buttons benötigen noch Verbesserungen.")
        else:
            print("❌ VERBESSERUNG ERFORDERLICH! Viele Buttons haben keine Funktionalität.")
            
    def cleanup(self):
        """Aufräumen"""
        if self.driver:
            self.driver.quit()
            print("🧹 WebDriver beendet")

def main():
    """Hauptfunktion"""
    tester = ButtonFunctionalityTester()
    
    try:
        tester.test_all_buttons()
    finally:
        tester.cleanup()

if __name__ == "__main__":
    main() 