#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Interfaz de línea de comandos para gestionar la aplicación
"""

import os
import sys
import subprocess
from pathlib import Path
from datetime import datetime

class CLI:
    def __init__(self):
        self.app_dir = Path(__file__).parent
        self.api_url = "mongodb+srv://examen1:mosarela@cluster0.ynvaey5.mongodb.net/?appName=Cluster0"
        
    def banner(self):
        """Muestra el banner"""
        print("""
╔════════════════════════════════════════╗
║   SISTEMA DE REGISTRO - APLICACIÓN    ║
║   Control desde Python                ║
╚════════════════════════════════════════╝
        """)
    
    def menu_principal(self):
        """Menú principal"""
        while True:
            print("\n┌─ MENÚ PRINCIPAL ─────────────────────┐")
            print("│ 1. ▶️  Iniciar aplicación             │")
            print("│ 2. 🔍 Verify setup                    │")
            print("│ 3. 📚 Ver documentación               │")
            print("│ 4. 🧹 Limpiar node_modules            │")
            print("│ 5. 📦 Reinstalar dependencias         │")
            print("│ 6. 🌐 Abrir en navegador              │")
            print("│ 0. ❌ Salir                            │")
            print("└──────────────────────────────────────┘")
            
            opcion = input("\nElige una opción (0-6): ").strip()
            
            if opcion == '1':
                self.iniciar()
            elif opcion == '2':
                self.verificar_setup()
            elif opcion == '3':
                self.ver_docs()
            elif opcion == '4':
                self.limpiar_npm()
            elif opcion == '5':
                self.reinstalar_dependencias()
            elif opcion == '6':
                self.abrir_navegador()
            elif opcion == '0':
                print("\n👋 ¡Hasta luego!")
                break
            else:
                print("❌ Opción no válida")
    
    def iniciar(self):
        """Inicia la aplicación"""
        print("\n🚀 Iniciando aplicación...\n")
        try:
            subprocess.run(
                ['npm', 'run', 'dev'],
                cwd=self.app_dir
            )
        except KeyboardInterrupt:
            print("\n✅ Aplicación detenida")
        except Exception as e:
            print(f"❌ Error: {e}")
    
    def verificar_setup(self):
        """Verifica la configuración"""
        print("\n🔍 Verificando setup...")
        
        checks = {
            'Node.js': self._check_node,
            'npm': self._check_npm,
            'MongoDB': self._check_mongo,
            '.env': self._check_env,
            'node_modules': self._check_node_modules,
        }
        
        for nombre, check_func in checks.items():
            ok = check_func()
            status = "✅" if ok else "❌"
            print(f"  {status} {nombre}")
    
    def _check_node(self):
        """Verifica Node.js"""
        try:
            subprocess.run(['node', '--version'], 
                         capture_output=True, check=True)
            return True
        except:
            return False
    
    def _check_npm(self):
        """Verifica npm"""
        try:
            subprocess.run(['npm', '--version'], 
                         capture_output=True, check=True)
            return True
        except:
            return False
    
    def _check_mongo(self):
        """Verifica MongoDB"""
        try:
            import pymongo
            client = pymongo.MongoClient('localhost', 27017, serverSelectionTimeoutMS=1000)
            client.server_info()
            return True
        except:
            return False
    
    def _check_env(self):
        """Verifica .env"""
        return (self.app_dir / '.env').exists()
    
    def _check_node_modules(self):
        """Verifica node_modules"""
        return (self.app_dir / 'node_modules').exists()
    
    def ver_docs(self):
        """Muestra documentación disponible"""
        print("\n📚 Documentación disponible:")
        docs = [
            ('README.md', 'Documentación general'),
            ('INICIO_RAPIDO.md', 'Guía rápida'),
            ('SETUP.md', 'Instalación detallada'),
            ('MONGODB-GUIA.md', 'Guía de MongoDB'),
        ]
        
        for i, (archivo, desc) in enumerate(docs, 1):
            ruta = self.app_dir / archivo
            if ruta.exists():
                print(f"  {i}. {archivo:20} - {desc}")
        
        opcion = input("\n¿Cuál quieres leer? (número o Enter para volver): ").strip()
        if opcion and opcion.isdigit():
            archivo = docs[int(opcion)-1][0]
            self._ver_archivo(archivo)
    
    def _ver_archivo(self, archivo):
        """Muestra contenido de un archivo"""
        ruta = self.app_dir / archivo
        if ruta.exists():
            with open(ruta) as f:
                print("\n" + "="*50)
                print(f"📄 {archivo}")
                print("="*50 + "\n")
                contenido = f.read()
                # Mostrar primeras 100 líneas
                lineas = contenido.split('\n')[:100]
                print('\n'.join(lineas))
                if len(contenido.split('\n')) > 100:
                    print(f"\n... ({len(contenido.split('\n'))-100} líneas más)")
    
    def limpiar_npm(self):
        """Limpia node_modules"""
        print("\n🧹 Limpiando node_modules...")
        try:
            import shutil
            node_modules = self.app_dir / 'node_modules'
            if node_modules.exists():
                shutil.rmtree(node_modules)
                print("✅ node_modules eliminado")
            else:
                print("ℹ️  node_modules no existe")
        except Exception as e:
            print(f"❌ Error: {e}")
    
    def reinstalar_dependencias(self):
        """Reinstala las dependencias"""
        print("\n📦 Reinstalando dependencias...")
        try:
            subprocess.run(['npm', 'install'], cwd=self.app_dir, check=True)
            print("✅ Dependencias instaladas")
        except Exception as e:
            print(f"❌ Error: {e}")
    
    def abrir_navegador(self):
        """Abre la aplicación en el navegador"""
        import webbrowser
        url = "http://localhost:3000"
        print(f"\n🌐 Abriendo {url}...")
        webbrowser.open(url)
    
    def run(self):
        """Ejecuta la CLI"""
        self.banner()
        self.menu_principal()


if __name__ == '__main__':
    cli = CLI()
    cli.run()
