#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script de Prueba - Simulador de Eventos ID3000
Envía eventos de prueba al servidor para verificar el parser
"""

import requests
import time
import json
from datetime import datetime

# Configuración
SERVER_URL = "http://localhost/api/central/evento"
REVISION_ID = 6  # ID de la revisión activa
INTERVALO_SEGUNDOS = 10  # Tiempo entre envíos del ciclo completo

# Eventos de prueba - Solo los problemáticos
eventos_prueba = [
    {
        "nombre": "❓ Central 1 L3 Sens.2 - Zona6 (NO APARECE)",
        "evento": """03011: mie 08-oct-25 16:06:56:   (PRUEBA) DE ALARMA
CENTRAL 1 informacion :L3 Sens.2 - Zona6 OPTI
Zona: Planta 6
Des: Pasillo Junto 634"""
    },
    {
        "nombre": "❓ Central 1 L2 Mod. 2 - Zona6 (NO APARECE)",
        "evento": """03014: mie 08-oct-25 16:07:28:   (PRUEBA) DE ALARMA
CENTRAL 1 informacion :L2 Mod. 2 - Zona6 PUL
Zona: Planta 6
Des: Pasillo Junto 632"""
    },
    {
        "nombre": "❓ Central 1 L3 Sens.20 - Zona6 (NO APARECE)",
        "evento": """03015: mie 08-oct-25 16:09:30:   (PRUEBA) DE ALARMA
CENTRAL 1 informacion :L3 Sens.20 - Zona6 OPTI
Zona: Planta 6
Des: Pasillo Junto 635"""
    }
]

def obtener_timestamp_actual():
    """Generar timestamp en formato del ID3000"""
    ahora = datetime.now()
    dias_semana = ['lun', 'mar', 'mie', 'jue', 'vie', 'sab', 'dom']
    meses = ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic']
    
    dia_semana = dias_semana[ahora.weekday()]
    mes = meses[ahora.month - 1]
    
    return f"{dia_semana} {ahora.day:02d}-{mes}-{ahora.year % 100:02d} {ahora.hour:02d}:{ahora.minute:02d}:{ahora.second:02d}"

def actualizar_timestamp_evento(evento_texto):
    """Actualizar el timestamp del evento con la hora actual"""
    lineas = evento_texto.split('\n')
    if lineas:
        # Extraer número de evento
        partes = lineas[0].split(':', 1)
        if len(partes) >= 2:
            numero_evento = partes[0]
            resto = ':'.join(partes[1:])
            # Buscar donde termina el timestamp y empieza el tipo
            if 'PRUEBA' in resto or 'ALARMA' in resto:
                # Reconstruir con nuevo timestamp
                nuevo_timestamp = obtener_timestamp_actual()
                tipo_evento = resto.split(':', 1)[1].strip() if ':' in resto else resto.strip()
                lineas[0] = f"{numero_evento}: {nuevo_timestamp}:   {tipo_evento}"
    
    return '\n'.join(lineas)

def enviar_evento(evento_texto, nombre_evento):
    """Enviar un evento al servidor"""
    # Actualizar timestamp con hora actual
    evento_actualizado = actualizar_timestamp_evento(evento_texto)
    
    try:
        # Preparar payload
        payload = {
            'evento': evento_actualizado,
            'revision_id': REVISION_ID
        }
        
        print(f"\n{'='*70}")
        print(f"🔵 Enviando: {nombre_evento}")
        print(f"{'='*70}")
        print(evento_actualizado)
        print(f"{'='*70}")
        
        # Enviar al servidor
        response = requests.post(
            SERVER_URL,
            json=payload,
            headers={'Content-Type': 'application/json'},
            timeout=5
        )
        
        if response.status_code == 200:
            print(f"✅ Evento enviado correctamente - Status: {response.status_code}")
            try:
                data = response.json()
                print(f"   Respuesta: {json.dumps(data, indent=2)}")
            except:
                print(f"   Respuesta (texto): {response.text[:200]}")
        else:
            print(f"⚠️  Error al enviar - Status: {response.status_code}")
            print(f"   Respuesta: {response.text[:200]}")
            
    except requests.exceptions.RequestException as e:
        print(f"❌ Error de conexión: {e}")
    except Exception as e:
        print(f"❌ Error inesperado: {e}")

def main():
    """Función principal - envía eventos en ciclo"""
    print("\n" + "="*70)
    print("🚀 SIMULADOR DE EVENTOS ID3000 - TEST PARSER")
    print("="*70)
    print(f"Servidor: {SERVER_URL}")
    print(f"Revisión ID: {REVISION_ID}")
    print(f"Intervalo: {INTERVALO_SEGUNDOS} segundos")
    print(f"Eventos a probar: {len(eventos_prueba)}")
    print("="*70)
    print("\n⚠️  Presiona Ctrl+C para detener el simulador\n")
    
    contador_ciclo = 0
    
    try:
        while True:
            contador_ciclo += 1
            print(f"\n{'#'*70}")
            print(f"# CICLO {contador_ciclo} - {datetime.now().strftime('%H:%M:%S')}")
            print(f"{'#'*70}")
            
            # Enviar cada evento
            for evento_data in eventos_prueba:
                enviar_evento(evento_data['evento'], evento_data['nombre'])
                time.sleep(2)  # Pequeña pausa entre eventos
            
            print(f"\n⏸️  Esperando {INTERVALO_SEGUNDOS} segundos hasta el próximo ciclo...")
            time.sleep(INTERVALO_SEGUNDOS)
            
    except KeyboardInterrupt:
        print("\n\n" + "="*70)
        print("🛑 Simulador detenido por el usuario")
        print(f"📊 Total de ciclos completados: {contador_ciclo}")
        print("="*70 + "\n")

if __name__ == "__main__":
    main()

