"""
Servicio de Procesamiento Estadístico
"""
import argparse
import logging
import threading
import coloredlogs
from .processors.statistics.processor import StatisticsProcessor
from .cli.statistics_menu import StatisticsCommandProcessor

def setup_logging():
    coloredlogs.install(
        level=logging.INFO,
        fmt='%(asctime)s [%(levelname)s] %(message)s'
    )
    return logging.getLogger(__name__)

def main():
    logger = setup_logging()
    
    parser = argparse.ArgumentParser(description='Procesamiento Estadístico')
    parser.add_argument('db_name', help='Nombre de la base de datos')
    parser.add_argument('-v', '--verbose', action='store_true', help='Modo verbose')
    parser.add_argument('--skip-historical', action='store_true', help='Omitir procesamiento histórico')
    args = parser.parse_args()

    try:
        processor = StatisticsProcessor(args.db_name)
        if args.verbose:
            processor.toggle_verbose()
            
        logger.info("Iniciando servicio de procesamiento estadístico...")

        if not args.skip_historical:
            # Procesar datos históricos primero
            logger.info("Procesando datos históricos pendientes...")
            if processor.process_historical_data():
                logger.info("Procesamiento histórico completado")
            else:
                logger.error("Error en procesamiento histórico")

        # Iniciar el procesamiento continuo en un thread
        process_thread = threading.Thread(target=processor.run)
        process_thread.daemon = True
        process_thread.start()

        # Iniciar el menú de comandos en el thread principal
        menu = StatisticsCommandProcessor(processor)
        menu.start()
        
    except KeyboardInterrupt:
        logger.info("Interrupción de usuario recibida")
    except Exception as e:
        logger.error(f"Error en sistema: {e}", exc_info=True)
    finally:
        if 'processor' in locals():
            processor.stop()
        logger.info("Servicio finalizado")

if __name__ == "__main__":
    main()