#!/usr/bin/env python3
"""
Script Python para procesar archivos TXT generados por el buque

Este script lee archivos TXT con datos CSV y los envía al servidor

Uso:
    python3 procesar_archivos_txt.py

Configuración:
    1. Define la carpeta donde el buque guarda los archivos TXT
    2. El script procesa los archivos y los mueve a una carpeta de "procesados"
"""

import os
import glob
import time
import requests
from datetime import datetime
from pathlib import Path

# ============================================
# CONFIGURACIÓN
# ============================================
# Carpeta donde el buque guarda los archivos TXT
CARPETA_ARCHIVOS = './archivos_buque/'

# Carpeta para archivos procesados
CARPETA_PROCESADOS = './archivos_buque/procesados/'

# URL del endpoint
API_URL = 'http://localhost/buque/api/buque.php'  # Cambiar en producción
# API_URL = 'https://www.devmastering.com/webservices/buque/api/buque.php'  # Producción

# API KEY (debe coincidir con config.php)
API_KEY = 'BUQUE2024_SECRET_KEY_XYZ789'

# Patrón de archivos a procesar
PATRON_ARCHIVOS = '*.txt'

# ============================================
# FUNCIONES
# ============================================

def crear_carpetas():
    """Crear carpetas si no existen"""
    for carpeta in [CARPETA_ARCHIVOS, CARPETA_PROCESADOS]:
        Path(carpeta).mkdir(parents=True, exist_ok=True)
        print(f"✅ Carpeta verificada: {carpeta}")

def enviar_datos(datos):
    """Enviar datos al servidor"""
    try:
        response = requests.post(
            API_URL,
            data=datos,
            headers={'Content-Type': 'text/plain'},
            timeout=10
        )
        
        if response.status_code == 200:
            resultado = response.json()
            return {
                'success': resultado.get('success', False),
                'response': resultado,
                'http_code': response.status_code
            }
        else:
            return {
                'success': False,
                'error': f'HTTP {response.status_code}',
                'http_code': response.status_code
            }
    except requests.exceptions.RequestException as e:
        return {
            'success': False,
            'error': str(e),
            'http_code': 0
        }

def procesar_archivo(archivo):
    """Procesar un archivo TXT"""
    nombre_archivo = os.path.basename(archivo)
    print(f"\n📄 Procesando: {nombre_archivo}")
    
    enviados = 0
    errores = 0
    
    try:
        with open(archivo, 'r', encoding='utf-8') as f:
            lineas = f.readlines()
    except Exception as e:
        print(f"  ❌ Error al leer archivo: {e}")
        return {'enviados': 0, 'errores': 1}
    
    for num_linea, linea in enumerate(lineas, 1):
        linea = linea.strip()
        
        # Saltar líneas vacías o comentarios
        if not linea or linea.startswith('#'):
            continue
        
        # Validar formato básico
        valores = linea.split(',')
        if len(valores) < 4:
            print(f"  ⚠️  Línea {num_linea} ignorada (formato inválido): {linea}")
            errores += 1
            continue
        
        # Enviar datos
        print(f"  📤 Enviando línea {num_linea}... ", end='', flush=True)
        
        resultado = enviar_datos(linea)
        
        if resultado['success'] and resultado.get('response', {}).get('success'):
            id_registro = resultado.get('response', {}).get('data', {}).get('id', 'N/A')
            print(f"✅ OK (ID: {id_registro})")
            enviados += 1
        else:
            mensaje = resultado.get('response', {}).get('message') or resultado.get('error', 'Error desconocido')
            print(f"❌ Error: {mensaje}")
            errores += 1
        
        # Pequeña pausa entre envíos
        time.sleep(0.1)
    
    print(f"  📊 Resumen: {enviados} enviados, {errores} errores")
    
    # Mover archivo a procesados
    try:
        timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
        archivo_procesado = os.path.join(CARPETA_PROCESADOS, f"{nombre_archivo}.{timestamp}")
        os.rename(archivo, archivo_procesado)
        print(f"  ✅ Archivo movido a procesados")
    except Exception as e:
        print(f"  ⚠️  No se pudo mover archivo: {e}")
        # Si no se puede mover, eliminar
        try:
            os.remove(archivo)
            print(f"  ✅ Archivo eliminado")
        except:
            pass
    
    return {'enviados': enviados, 'errores': errores}

# ============================================
# PROGRAMA PRINCIPAL
# ============================================

def main():
    print("=" * 50)
    print("Procesador de Archivos TXT - Sistema Buque")
    print("=" * 50)
    print()
    
    # Crear carpetas
    crear_carpetas()
    
    # Buscar archivos
    patron = os.path.join(CARPETA_ARCHIVOS, PATRON_ARCHIVOS)
    archivos = glob.glob(patron)
    
    if not archivos:
        print(f"📭 No se encontraron archivos TXT en: {CARPETA_ARCHIVOS}")
        print(f"   Patrón buscado: {PATRON_ARCHIVOS}")
        return
    
    print(f"📁 Archivos encontrados: {len(archivos)}")
    
    total_enviados = 0
    total_errores = 0
    
    # Procesar cada archivo
    for archivo in archivos:
        resultado = procesar_archivo(archivo)
        total_enviados += resultado['enviados']
        total_errores += resultado['errores']
    
    # Resumen final
    print("\n" + "=" * 50)
    print("📊 Resumen Final")
    print("=" * 50)
    print(f"Total enviados: {total_enviados}")
    print(f"Total errores: {total_errores}")
    print(f"Archivos procesados: {len(archivos)}")
    print("=" * 50)

if __name__ == '__main__':
    main()

