#!/usr/bin/env python3
"""
🎉 DEMO BambuLuc v1.2.0 - IMPRESIÓN AUTOMÁTICA
==============================================

Este demo muestra las nuevas funcionalidades de BambuLuc v1.2.0:
- ✅ Impresión automática sin intervención manual
- ✅ Configuración AMS inteligente
- ✅ Análisis 3MF completo
- ✅ Subida optimizada de archivos grandes

BREAKTHROUGH: 21 de julio de 2025
"""

import asyncio
import sys
import os
sys.path.append(os.path.dirname(__file__))

from bambuluc_v1_2_0 import BambuLuc, quick_print

async def demo_completo():
    """Demo completo de BambuLuc v1.2.0"""
    
    print("🎉 DEMO BAMBULUC v1.2.0 - IMPRESIÓN AUTOMÁTICA")
    print("=" * 60)
    print()
    
    # Configuración de la impresora
    IP = "192.168.20.76"
    ACCESS_CODE = "93481864" 
    SERIAL = "03919C430101971"
    
    # Archivo de prueba
    archivo_3mf = "c:/Users/angel.barbero/Desktop/proyectos/MPFarm/prueba.gcode.3mf"
    
    if not os.path.exists(archivo_3mf):
        print(f"❌ Archivo no encontrado: {archivo_3mf}")
        return
    
    # 1. DEMO BÁSICO - Impresión automática en una línea
    print("🚀 DEMO 1: IMPRESIÓN AUTOMÁTICA EN UNA LÍNEA")
    print("-" * 40)
    
    try:
        success = await quick_print(IP, ACCESS_CODE, SERIAL, archivo_3mf)
        if success:
            print("✅ ¡Impresión iniciada automáticamente con quick_print()!")
        else:
            print("❌ Error en quick_print()")
    except Exception as e:
        print(f"❌ Error: {e}")
    
    print()
    input("Presiona Enter para continuar con el demo avanzado...")
    print()
    
    # 2. DEMO AVANZADO - Control completo
    print("🔧 DEMO 2: CONTROL AVANZADO PASO A PASO")
    print("-" * 40)
    
    # Crear instancia BambuLuc
    bambu = BambuLuc(IP, ACCESS_CODE, SERIAL, enable_anti_sd=True)
    
    try:
        # Análisis del archivo 3MF
        print("📋 Analizando archivo 3MF...")
        plate_number, gcode_path, bed_type, filament_info = bambu.analyze_3mf_file(archivo_3mf)
        
        print(f"   ✅ Placa: {plate_number}")
        print(f"   ✅ GCode: {gcode_path}")
        print(f"   ✅ Bed Type: {bed_type}")
        print(f"   ✅ Filamentos: {len(filament_info)}")
        
        # Configuración AMS manual (opcional)
        print("\n🔧 Configurando AMS...")
        if filament_info:
            for filament_id, info in list(filament_info.items())[:1]:  # Solo el primero
                response = bambu.configure_ams(
                    ams_id=0,
                    tray_id=0,
                    filament_type=info.get('type', 'PLA'),
                    filament_color=info.get('color', '#000000FF')
                )
                print(f"   ✅ AMS configurado: {info.get('type', 'PLA')}")
                break
        
        # Subida del archivo
        print("\n📤 Subiendo archivo...")
        remote_filename = f"demo_bambuluc_v1_2_0.3mf"
        upload_success = await bambu.upload_file_ftp(archivo_3mf, remote_filename)
        
        if upload_success:
            print("   ✅ Archivo subido exitosamente")
            
            # Esperar procesamiento
            print("\n⏳ Esperando procesamiento...")
            await asyncio.sleep(3)
            
            # Comando de impresión automática
            print("\n🖨️ Iniciando impresión automática...")
            print("   🎯 Usando URL mágica: file:///sdcard/cache/")
            
            print_success = await bambu.send_print_command_auto(
                remote_filename, 
                gcode_path, 
                bed_type
            )
            
            if print_success:
                print("   🎉 ¡IMPRESIÓN INICIADA AUTOMÁTICAMENTE!")
                print("   📱 Verificar progreso en la pantalla de la impresora")
            else:
                print("   ❌ Error iniciando impresión")
        else:
            print("   ❌ Error subiendo archivo")
    
    except Exception as e:
        print(f"❌ Error en demo avanzado: {e}")
    
    print()
    print("🎊 DEMO COMPLETADO")
    print()

async def demo_configuracion_ams():
    """Demo específico de configuración AMS"""
    
    print("🔧 DEMO CONFIGURACIÓN AMS AVANZADA")
    print("=" * 40)
    
    bambu = BambuLuc("192.168.20.76", "93481864", "03919C430101971")
    
    # Configuraciones de ejemplo
    configuraciones = [
        {
            "ams_id": 0, "tray_id": 0, 
            "filament_type": "PLA", "filament_color": "#FF0000FF",
            "nozzle_temp_min": 190, "nozzle_temp_max": 230
        },
        {
            "ams_id": 0, "tray_id": 1,
            "filament_type": "ABS", "filament_color": "#0000FFFF", 
            "nozzle_temp_min": 240, "nozzle_temp_max": 260
        },
        {
            "ams_id": 0, "tray_id": 2,
            "filament_type": "PETG", "filament_color": "#00FF00FF",
            "nozzle_temp_min": 220, "nozzle_temp_max": 250
        }
    ]
    
    for i, config in enumerate(configuraciones):
        print(f"\n🔧 Configurando Tray {i}: {config['filament_type']}")
        response = bambu.configure_ams(**config)
        if response:
            print(f"   ✅ Configurado exitosamente")
        else:
            print(f"   ❌ Error en configuración")
        
        # Esperar entre configuraciones
        await asyncio.sleep(1)
    
    print("\n✅ Configuración AMS completada")

def demo_analisis_3mf():
    """Demo de análisis de archivos 3MF"""
    
    print("📋 DEMO ANÁLISIS 3MF")
    print("=" * 25)
    
    archivo = "c:/Users/angel.barbero/Desktop/proyectos/MPFarm/prueba.gcode.3mf"
    
    if not os.path.exists(archivo):
        print(f"❌ Archivo no encontrado: {archivo}")
        return
    
    bambu = BambuLuc("192.168.20.76", "93481864", "03919C430101971")
    
    try:
        plate_number, gcode_path, bed_type, filament_info = bambu.analyze_3mf_file(archivo)
        
        print(f"\n📊 RESULTADOS DEL ANÁLISIS:")
        print(f"   📋 Placa: {plate_number}")
        print(f"   📄 GCode Path: {gcode_path}")
        print(f"   🛏️ Bed Type: {bed_type}")
        print(f"   🎨 Filamentos detectados: {len(filament_info)}")
        
        if filament_info:
            print(f"\n🎨 DETALLES DE FILAMENTOS:")
            for filament_id, info in filament_info.items():
                print(f"   Filamento {filament_id}:")
                print(f"     - Tipo: {info.get('type', 'N/A')}")
                print(f"     - Color: {info.get('color', 'N/A')}")
                print(f"     - Usado: {info.get('used_g', 0):.2f}g / {info.get('used_m', 0):.2f}m")
        
    except Exception as e:
        print(f"❌ Error analizando archivo: {e}")

async def menu_demo():
    """Menú interactivo para los demos"""
    
    while True:
        print("\n🎉 BAMBULUC v1.2.0 - MENÚ DE DEMOS")
        print("=" * 40)
        print("1. 🚀 Demo Impresión Automática Completa")
        print("2. 🔧 Demo Configuración AMS")
        print("3. 📋 Demo Análisis 3MF") 
        print("4. 🎯 Demo Quick Print (Una línea)")
        print("0. ❌ Salir")
        print()
        
        opcion = input("Selecciona una opción: ").strip()
        
        if opcion == "1":
            await demo_completo()
        elif opcion == "2":
            await demo_configuracion_ams()
        elif opcion == "3":
            demo_analisis_3mf()
        elif opcion == "4":
            archivo = "c:/Users/angel.barbero/Desktop/proyectos/MPFarm/prueba.gcode.3mf"
            if os.path.exists(archivo):
                print("🚀 Ejecutando quick_print()...")
                success = await quick_print("192.168.20.76", "93481864", "03919C430101971", archivo)
                print(f"✅ Resultado: {'Éxito' if success else 'Error'}")
            else:
                print("❌ Archivo no encontrado")
        elif opcion == "0":
            print("👋 ¡Hasta luego!")
            break
        else:
            print("❌ Opción inválida")

if __name__ == "__main__":
    print("🎉 BambuLuc v1.2.0 - Impresión Automática Demo")
    print("Copyright (c) 2025 Angel Luis Barbero Guerras")
    print()
    
    try:
        asyncio.run(menu_demo())
    except KeyboardInterrupt:
        print("\n👋 Demo cancelado por el usuario")
    except Exception as e:
        print(f"\n❌ Error en demo: {e}")
