#!/usr/bin/env python3
"""
EJEMPLO DE USO - BambuLuc
========================
Ejemplo simple de como usar la librería BambuLuc
Desarrollada por Angel Luis Barbero Guerras
"""

from bambuluc import BambuLabPrinter, BambuLabManager
import time

def ejemplo_basico():
    """Ejemplo básico de uso"""
    print("🚀 EJEMPLO BÁSICO - BAMBULUC")
    print("=" * 50)
    
    # Configuración de tu impresora
    PRINTER_IP = "192.168.20.76"
    ACCESS_CODE = "93481864"
    DEVICE_ID = "03919C430101971"
    ARCHIVO = "prueba.gcode.3mf"
    
    # Crear instancia
    printer = BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID)
    
    # Definir callbacks
    def on_upload_progress(bytes_sent, total_bytes):
        progress = (bytes_sent / total_bytes) * 100
        if progress % 10 < 1:  # Mostrar cada 10%
            print(f"📤 Subida: {progress:.1f}%")
    
    def on_file_progress(event, data):
        if event == 'accepted':
            print(f"✅ Archivo aceptado: {data}")
        elif event == 'prepared':
            print(f"🎉 Archivo preparado: {data}")
        elif event == 'preparing':
            print(f"📊 Preparando: {data}%")
    
    def on_status_change(new_stage, old_stage):
        print(f"🔄 Estado: {old_stage} → {new_stage}")
    
    try:
        # Conectar
        print("🔌 Conectando...")
        if not printer.connect():
            print("❌ Error conectando")
            return
        
        # Configurar callbacks
        printer.on_file_progress = on_file_progress
        printer.on_status_change = on_status_change
        
        # Enviar archivo
        print(f"📤 Enviando {ARCHIVO}...")
        success = printer.send_file(
            ARCHIVO,
            auto_start=False,  # No iniciar automáticamente
            use_ams=True,      # Usar AMS
            bed_leveling=True, # Nivelación de cama
            progress_callback=on_upload_progress
        )
        
        if success:
            print("✅ ¡Archivo enviado exitosamente!")
            
            # Esperar preparación
            print("⏳ Esperando preparación...")
            for i in range(120):  # 2 minutos
                if printer.current_file and printer.current_file.prepared:
                    print("🎉 ¡Archivo preparado y listo!")
                    break
                time.sleep(1)
            
            # Mostrar estado
            status = printer.get_status()
            print(f"📊 Estado actual: {status.stage}")
            
        else:
            print("❌ Error enviando archivo")
    
    except Exception as e:
        print(f"❌ Error: {e}")
    
    finally:
        # Desconectar
        printer.disconnect()
        print("👋 Desconectado")

def ejemplo_multiples_impresoras():
    """Ejemplo con múltiples impresoras"""
    print("🏭 EJEMPLO MÚLTIPLES IMPRESORAS")
    print("=" * 50)
    
    # Gestor de impresoras
    manager = BambuLabManager()
    
    # Agregar impresoras
    printer1 = manager.add_printer("Bambu_Salon", "192.168.20.76", "93481864", "03919C430101971")
    # printer2 = manager.add_printer("Bambu_Taller", "192.168.20.77", "12345678", "03919C430101972")
    
    try:
        # Conectar todas
        results = manager.connect_all()
        
        for name, connected in results.items():
            if connected:
                print(f"✅ {name}: Conectado")
            else:
                print(f"❌ {name}: Error conexión")
        
        # Obtener estado de todas
        all_status = manager.get_all_status()
        
        for name, status in all_status.items():
            print(f"📊 {name}: {status.stage} - {status.progress}%")
        
        # Enviar archivo a impresora específica
        printer = manager.get_printer("Bambu_Salon")
        if printer and printer.is_connected():
            success = printer.send_file("prueba.gcode.3mf", auto_start=False)
            if success:
                print("✅ Archivo enviado a Bambu_Salon")
    
    except Exception as e:
        print(f"❌ Error: {e}")
    
    finally:
        # Desconectar todas
        manager.disconnect_all()
        print("👋 Todas desconectadas")

def ejemplo_informacion_completa():
    """Ejemplo mostrando toda la información disponible"""
    print("📋 EJEMPLO INFORMACIÓN COMPLETA")
    print("=" * 50)
    
    PRINTER_IP = "192.168.20.76"
    ACCESS_CODE = "93481864"
    DEVICE_ID = "03919C430101971"
    
    with BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID) as printer:
        if printer.connect():
            print("✅ Conectado! Obteniendo información...")
            
            # Información básica
            status = printer.get_status()
            print(f"\n🎯 Estado General:")
            print(f"  • Etapa: {status.stage}")
            print(f"  • Estado GCode: {status.gcode_state}")
            print(f"  • Progreso: {status.progress}%")
            print(f"  • Subestado: {status.sub_stage}")
            
            # Archivo actual
            file_info = printer.get_current_file_info()
            print(f"\n📄 Archivo Actual:")
            print(f"  • Nombre: {file_info['name']}")
            print(f"  • Tamaño: {file_info['size']} bytes")
            print(f"  • Progreso: {file_info['progress']}%")
            print(f"  • Capa: {file_info['layer']}")
            print(f"  • Tiempo restante: {file_info['remaining_time']}s")
            
            # Temperaturas detalladas
            temp_info = printer.get_temperature_info()
            heating = printer.is_heating()
            print(f"\n🌡️ Temperaturas Detalladas:")
            print(f"  • Cama: {temp_info['bed']['current']}°C → {temp_info['bed']['target']}°C")
            print(f"    Calentando: {heating['bed']} (Δ: {temp_info['bed']['delta']:.1f}°C)")
            print(f"  • Nozzle: {temp_info['nozzle']['current']}°C → {temp_info['nozzle']['target']}°C")
            print(f"    Calentando: {heating['nozzle']} (Δ: {temp_info['nozzle']['delta']:.1f}°C)")
            print(f"  • Cámara: {temp_info['chamber']['current']}°C → {temp_info['chamber']['target']}°C")
            print(f"    Calentando: {heating['chamber']} (Δ: {temp_info['chamber']['delta']:.1f}°C)")
            
            # Información de cámara
            camera_info = printer.get_camera_info()
            print(f"\n📸 Cámara:")
            print(f"  • Disponible: {camera_info['available']}")
            if camera_info['available']:
                print(f"  • URL: {camera_info['url']}")
                print(f"  • Grabando: {camera_info['recording']}")
                print(f"  • Timelapse: {camera_info['timelapse']}")
                
                # Obtener imagen
                print(f"\n📸 Obteniendo imagen de la cámara...")
                image_data = printer.get_camera_image()
                if image_data:
                    print(f"  ✅ Imagen obtenida: {len(image_data):,} bytes")
                    
                    # Guardar imagen con timestamp
                    from datetime import datetime
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                    filename = f"captura_{timestamp}.jpg"
                    
                    if printer.save_camera_image(filename):
                        print(f"  💾 Imagen guardada: {filename}")
                else:
                    print(f"  ❌ No se pudo obtener imagen")
            
            # Filamento actual
            filament = printer.get_filament_info()
            if filament:
                print(f"\n🧵 Filamento Actual:")
                print(f"  • Tipo: {filament.type}")
                print(f"  • Color: {filament.color}")
                print(f"  • Marca: {filament.brand}")
                print(f"  • Material: {filament.material}")
                print(f"  • Temperatura: {filament.temperature}°C")
                print(f"  • Restante: {filament.remaining}%")
            
            # Información del AMS
            ams_info = printer.get_ams_info()
            if ams_info:
                print(f"\n📦 AMS ({len(ams_info)} bandejas):")
                for i, ams in enumerate(ams_info):
                    print(f"  • Bandeja {ams.tray_id}: {ams.filament.type} - {ams.filament.color}")
                    print(f"    Estado: {ams.status}")
                    print(f"    Restante: {ams.filament.remaining}%")
            
            # Información completa (JSON)
            print(f"\n📊 Información Completa:")
            detailed = printer.get_detailed_status()
            import json
            print(json.dumps(detailed, indent=2, ensure_ascii=False))
            
        else:
            print("❌ No se pudo conectar")

def ejemplo_camara_monitoreo():
    """Ejemplo específico para cámara y monitoreo visual"""
    print("📸 EJEMPLO CÁMARA Y MONITOREO VISUAL")
    print("=" * 50)
    
    PRINTER_IP = "192.168.20.76"
    ACCESS_CODE = "93481864"
    DEVICE_ID = "03919C430101971"
    
    with BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID) as printer:
        if printer.connect():
            print("✅ Conectado! Verificando cámara...")
            
            camera_info = printer.get_camera_info()
            
            if camera_info['available']:
                print(f"📸 Cámara disponible en: {camera_info['url']}")
                print(f"📹 Grabando: {camera_info['recording']}")
                print(f"🎬 Timelapse: {camera_info['timelapse']}")
                
                # Captura única
                print("\n📸 Capturando imagen...")
                image_data = printer.get_camera_image()
                if image_data:
                    print(f"✅ Imagen obtenida: {len(image_data):,} bytes")
                    
                    # Guardar con timestamp
                    from datetime import datetime
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                    filename = f"impresora_{timestamp}.jpg"
                    
                    if printer.save_camera_image(filename):
                        print(f"💾 Imagen guardada: {filename}")
                
                # Monitoreo continuo
                print(f"\n🔄 Iniciando monitoreo continuo (10 capturas cada 30s)...")
                import time
                
                for i in range(10):
                    # Mostrar estado actual
                    status = printer.get_status()
                    temp_info = printer.get_temperature_info()
                    
                    print(f"\n📊 Captura {i+1}/10:")
                    print(f"  • Estado: {status.stage}")
                    print(f"  • Progreso: {status.progress}%")
                    print(f"  • Cama: {temp_info['bed']['current']}°C → {temp_info['bed']['target']}°C")
                    print(f"  • Nozzle: {temp_info['nozzle']['current']}°C → {temp_info['nozzle']['target']}°C")
                    
                    # Capturar imagen
                    filename = f"progreso_{i+1:02d}.jpg"
                    if printer.save_camera_image(filename):
                        print(f"  📸 Captura guardada: {filename}")
                    else:
                        print(f"  ❌ Error capturando imagen")
                    
                    if i < 9:  # No esperar en la última iteración
                        print(f"  ⏳ Esperando 30 segundos...")
                        time.sleep(30)
                
                print(f"\n🎉 Monitoreo completado! 10 imágenes guardadas.")
                
            else:
                print("❌ Cámara no disponible")
                
        else:
            print("❌ No se pudo conectar")

def ejemplo_monitoreo():
    """Ejemplo con monitoreo continuo"""
    print("👁️ EJEMPLO MONITOREO CONTINUO")
    print("=" * 50)
    
    PRINTER_IP = "192.168.20.76"
    ACCESS_CODE = "93481864"
    DEVICE_ID = "03919C430101971"
    
    # Usar context manager
    with BambuLabPrinter(PRINTER_IP, ACCESS_CODE, DEVICE_ID) as printer:
        
        # Callbacks detallados
        def on_status_change(new_stage, old_stage):
            print(f"🔄 [{time.strftime('%H:%M:%S')}] Estado: {new_stage}")
            
            if new_stage == 'printing':
                print("🖨️ ¡Impresión iniciada!")
                
                # Mostrar información del archivo
                file_info = printer.get_current_file_info()
                print(f"📄 Archivo: {file_info['name']}")
                
                # Mostrar filamento
                filament = printer.get_filament_info()
                if filament:
                    print(f"🧵 Filamento: {filament.type} - {filament.color}")
            elif new_stage == 'pause':
                print("⏸️ Impresión pausada")
            elif new_stage == 'finish':
                print("🎉 ¡Impresión terminada!")
        
        def on_file_progress(event, data):
            timestamp = time.strftime('%H:%M:%S')
            print(f"📁 [{timestamp}] {event}: {data}")
        
        # Configurar callbacks
        printer.on_status_change = on_status_change
        printer.on_file_progress = on_file_progress
        
        # Iniciar monitoreo
        printer.start_monitoring()
        
        # Estado inicial
        status = printer.get_status()
        print(f"📊 Estado inicial: {status.stage}")
        print(f"🌡️ Temperaturas: Cama {status.bed_temp}°C, Nozzle {status.nozzle_temp}°C")
        print(f"📶 WiFi: {status.wifi_signal}%")
        
        # Monitorear por 2 minutos
        print("👁️ Monitoreando por 2 minutos...")
        for i in range(120):
            time.sleep(1)
            
            # Mostrar progreso cada 30 segundos
            if i % 30 == 0 and i > 0:
                current_status = printer.get_status()
                print(f"⏱️ [{i}s] Estado: {current_status.stage}, Progreso: {current_status.progress}%")
        
        print("✅ Monitoreo completado")

if __name__ == "__main__":
    print("🎯 BAMBULUC - EJEMPLOS DE USO")
    print("=" * 60)
    
    # Menú de ejemplos
    print("Selecciona un ejemplo:")
    print("1. Ejemplo básico")
    print("2. Múltiples impresoras")
    print("3. Monitoreo continuo")
    print("4. Información completa")
    print("5. Cámara y monitoreo visual")
    
    try:
        opcion = input("Opción (1-5): ").strip()
        
        if opcion == "1":
            ejemplo_basico()
        elif opcion == "2":
            ejemplo_multiples_impresoras()
        elif opcion == "3":
            ejemplo_monitoreo()
        elif opcion == "4":
            ejemplo_informacion_completa()
        elif opcion == "5":
            ejemplo_camara_monitoreo()
        else:
            print("🚀 Ejecutando ejemplo básico por defecto...")
            ejemplo_basico()
    
    except KeyboardInterrupt:
        print("\n👋 Saliendo...")
    except Exception as e:
        print(f"❌ Error: {e}")
