#!/usr/bin/env python3
"""
Script para importar datos desde Excel a la base de datos
Borra los datos existentes y carga los del archivo Excel
"""

import os
import sys
import pandas as pd
from datetime import datetime
import pytz
from app import app, db, PeticionBackup, TIMEZONE_MADRID

def parse_datetime(value):
    """
    Convierte diferentes formatos de fecha/hora a datetime con timezone de Madrid
    """
    if pd.isna(value) or value == '' or value is None:
        return datetime.now(TIMEZONE_MADRID)
    
    try:
        # Si ya es datetime
        if isinstance(value, datetime):
            if value.tzinfo is None:
                return TIMEZONE_MADRID.localize(value)
            return value.astimezone(TIMEZONE_MADRID)
        
        # Si es string, intentar parsear
        if isinstance(value, str):
            # Intentar varios formatos comunes
            formats = [
                '%Y-%m-%d %H:%M:%S',
                '%d/%m/%Y %H:%M:%S',
                '%Y-%m-%d',
                '%d/%m/%Y',
                '%Y/%m/%d %H:%M:%S',
                '%d-%m-%Y %H:%M:%S',
            ]
            
            for fmt in formats:
                try:
                    dt = datetime.strptime(value, fmt)
                    return TIMEZONE_MADRID.localize(dt)
                except ValueError:
                    continue
        
        # Si es timestamp de pandas
        if isinstance(value, pd.Timestamp):
            dt = value.to_pydatetime()
            if dt.tzinfo is None:
                return TIMEZONE_MADRID.localize(dt)
            return dt.astimezone(TIMEZONE_MADRID)
        
        # Si nada funciona, usar fecha actual
        return datetime.now(TIMEZONE_MADRID)
    except Exception as e:
        print(f"⚠️  Error parseando fecha '{value}': {e}. Usando fecha actual.")
        return datetime.now(TIMEZONE_MADRID)

def import_excel(excel_path):
    """
    Importa datos desde un archivo Excel a la base de datos
    """
    if not os.path.exists(excel_path):
        print(f"❌ Error: El archivo '{excel_path}' no existe")
        return False
    
    print(f"📂 Leyendo archivo: {excel_path}")
    
    try:
        # Leer Excel
        df = pd.read_excel(excel_path)
        print(f"✅ Archivo leído correctamente: {len(df)} registros encontrados")
        
        # Mostrar columnas del Excel
        print(f"\n📋 Columnas en el Excel:")
        for i, col in enumerate(df.columns, 1):
            print(f"   {i}. {col}")
        
        # Mapeo de columnas según el Excel real
        # Columnas: Created on | Nombre de la empresa | Nombre del empleado | Telefono del pedido | 
        #           Email del pedido | Código del lote | Tipo de lote | Tipo de entrega | 
        #           Dirección de enrega | Franja horaria desde | Franja horaria hasta | 
        #           Desglose dirección | Desglose dirección detalle | Desglose CP | 
        #           Desglose población | Desglose provincia | Identificador cliente | 
        #           Observaciones del pedido | Sociedad | Delegación
        column_mapping = {
            0: 'datetime_registro',      # Created on
            1: 'empresa',                 # Nombre de la empresa
            2: 'empleado',                # Nombre del empleado
            3: 'telefono',                # Telefono del pedido
            4: 'email',                   # Email del pedido
            5: 'codigo_lote',             # Código del lote
            6: 'tipo_lote',               # Tipo de lote
            7: 'entrega',                 # Tipo de entrega
            8: 'direccion',               # Dirección de enrega
            9: 'franja_horaria_desde',    # Franja horaria desde
            10: 'franja_horaria_hasta',   # Franja horaria hasta
            11: 'desglose_direccion',     # Desglose dirección
            12: 'desglose_detalle_direccion',  # Desglose dirección detalle
            13: 'desglose_cp',            # Desglose CP
            14: 'desglose_poblacion',     # Desglose población
            15: 'desglose_provincia',     # Desglose provincia
            16: 'identificador_cliente',  # Identificador cliente
            17: 'observaciones',          # Observaciones del pedido
            18: 'sociedad',               # Sociedad
            19: 'delegacion'              # Delegación
        }
        
        # Confirmar antes de borrar
        print(f"\n⚠️  ADVERTENCIA: Se borrarán TODOS los datos existentes en la base de datos")
        print(f"   Se importarán {len(df)} nuevos registros")
        respuesta = input("\n¿Continuar? (si/no): ").strip().lower()
        
        if respuesta not in ['si', 's', 'yes', 'y']:
            print("❌ Operación cancelada")
            return False
        
        with app.app_context():
            # Borrar datos existentes
            print("\n🗑️  Borrando datos existentes...")
            deleted_count = PeticionBackup.query.delete()
            db.session.commit()
            print(f"✅ {deleted_count} registros eliminados")
            
            # Importar nuevos datos
            print(f"\n📥 Importando {len(df)} registros...")
            imported = 0
            errors = 0
            
            for index, row in df.iterrows():
                try:
                    # Crear nueva petición
                    peticion = PeticionBackup()
                    
                    # Asignar valores según las columnas
                    for col_index, field_name in column_mapping.items():
                        if col_index < len(df.columns):
                            value = row.iloc[col_index]
                            
                            # Manejar valores nulos
                            if pd.isna(value):
                                value = None
                            elif isinstance(value, str):
                                value = value.strip() if value.strip() else None
                            
                            # Caso especial para datetime_registro
                            if field_name == 'datetime_registro':
                                value = parse_datetime(value)
                            
                            # No asignar ID si queremos que sea auto-incremental
                            if field_name != 'id':
                                setattr(peticion, field_name, value)
                    
                    db.session.add(peticion)
                    imported += 1
                    
                    # Commit cada 100 registros
                    if imported % 100 == 0:
                        db.session.commit()
                        print(f"   ✓ {imported} registros importados...")
                
                except Exception as e:
                    errors += 1
                    print(f"   ⚠️  Error en fila {index + 2}: {e}")
                    db.session.rollback()
            
            # Commit final
            db.session.commit()
            
            print(f"\n{'='*50}")
            print(f"✅ Importación completada")
            print(f"   • Registros importados: {imported}")
            print(f"   • Errores: {errors}")
            print(f"{'='*50}")
            
            return True
    
    except Exception as e:
        print(f"\n❌ Error durante la importación: {e}")
        import traceback
        traceback.print_exc()
        return False

if __name__ == '__main__':
    # Ruta al archivo Excel
    excel_file = 'lotify.plataforma.pedidos.xlsx'
    
    # Si se pasa como argumento, usar ese
    if len(sys.argv) > 1:
        excel_file = sys.argv[1]
    
    # Obtener ruta absoluta
    if not os.path.isabs(excel_file):
        excel_file = os.path.join(os.path.dirname(__file__), excel_file)
    
    print("="*50)
    print("  IMPORTADOR DE DATOS DESDE EXCEL")
    print("="*50)
    
    success = import_excel(excel_file)
    
    sys.exit(0 if success else 1)
