"""
================================================================
 Script de importacion de datos - Sistema de Consultas
================================================================
Lee los 3 archivos de Excel:
    - Robo_de_vehiculo.xlsx
    - Alto_impacto.xlsx
    - Resto_de_delitos.xlsx

y los inserta en la tabla "expedientes" de la base de datos
MySQL "sistema_consultas" (phpMyAdmin), en una sola tabla,
diferenciados por la columna "categoria".

REQUISITOS (instalar una sola vez):
    pip install pandas openpyxl mysql-connector-python

CONFIGURACION:
    - Ajusta la variable RUTA_EXCEL con la carpeta donde estan tus 3 archivos.
    - Ajusta los datos de conexion en DB_CONFIG segun tu servidor.

USO:
    python importar_datos.py
================================================================
"""

import os
import sys
import pandas as pd
import mysql.connector
from mysql.connector import Error

# ----------------------------------------------------------------
# 1) CONFIGURACION - AJUSTA ESTOS VALORES
# ----------------------------------------------------------------

# Carpeta donde estan tus archivos .xlsx
RUTA_EXCEL = r"C:\Users\pablo\Documents\excel"

# Mapa de archivo -> categoria en la base de datos
ARCHIVOS = {
    "Robo_de_vehiculo.xlsx": "ROBO_DE_VEHICULO",
    "Alto_impacto.xlsx":     "ALTO_IMPACTO",
    "Resto_de_delitos.xlsx": "RESTO_DE_DELITOS",
}

# Datos de conexion a MySQL / phpMyAdmin
DB_CONFIG = {
    "host": "localhost",
    "user": "root",
    "password": "",          # coloca aqui tu password de MySQL si aplica
    "database": "sistema_consultas",
    "charset": "utf8mb4",
}

# Si True, borra todos los registros existentes en "expedientes"
# antes de importar (util para volver a cargar todo desde cero).
LIMPIAR_TABLA_ANTES_DE_IMPORTAR = True


# ----------------------------------------------------------------
# 2) FUNCIONES
# ----------------------------------------------------------------

def limpiar_texto(valor):
    """Convierte NaN/None a None y recorta espacios en textos."""
    if pd.isna(valor):
        return None
    if isinstance(valor, str):
        texto = valor.strip()
        return texto if texto != "" else None
    return valor


def limpiar_fecha(valor):
    """Convierte la fecha de Excel a formato YYYY-MM-DD o None."""
    if pd.isna(valor):
        return None
    try:
        fecha = pd.to_datetime(valor)
        return fecha.strftime("%Y-%m-%d")
    except Exception:
        return None


def leer_archivo(ruta_completa, categoria):
    """
    Lee un archivo Excel con la estructura:
    (columna vacia) | Expediente | Tipo de orden | Fecha de orden |
    Juzgado | Nombre | Municipio | Desglose de delitos

    La primera fila util contiene los encabezados (fila index 0 del excel
    ya trae encabezados reales en la fila 1 de los datos), por lo que
    se usa header=1 (segunda fila del archivo).
    """
    df = pd.read_excel(ruta_completa, sheet_name=0, header=1)

    # Normaliza nombres de columnas (por si vienen con espacios extra)
    df.columns = [str(c).strip().upper() for c in df.columns]

    columnas_esperadas = {
        "CAUSA/CARPETA ADMINISTRATIVA/ EXPEDIENTE": "expediente",
        "TIPO DE ORDEN": "tipo_orden",
        "FECHA DE ORDEN": "fecha_orden",
        "JUZGADO": "juzgado",
        "NOMBRE": "nombre",
        "MUNICIPIO POSIBLE LOCALIZACIÓN VALIDADO": "municipio",
        "DESGLOSE RESTO DE DELITOS": "delito",
    }

    # Renombra solo las columnas que existan en el archivo
    renombrar = {c: columnas_esperadas[c] for c in df.columns if c in columnas_esperadas}
    df = df.rename(columns=renombrar)

    registros = []
    for _, fila in df.iterrows():
        nombre = limpiar_texto(fila.get("nombre"))
        if not nombre:
            continue  # se ignoran filas sin nombre (vacias / basura)

        registros.append((
            categoria,
            limpiar_texto(fila.get("expediente")),
            limpiar_texto(fila.get("tipo_orden")),
            limpiar_fecha(fila.get("fecha_orden")),
            limpiar_texto(fila.get("juzgado")),
            nombre,
            limpiar_texto(fila.get("municipio")),
            limpiar_texto(fila.get("delito")),
        ))

    return registros


def conectar():
    try:
        conexion = mysql.connector.connect(**DB_CONFIG)
        return conexion
    except Error as e:
        print(f"ERROR al conectar a la base de datos: {e}")
        sys.exit(1)


def importar():
    print("=" * 60)
    print(" Importacion de datos - Sistema de Consultas")
    print("=" * 60)

    todos_los_registros = []

    for archivo, categoria in ARCHIVOS.items():
        ruta_completa = os.path.join(RUTA_EXCEL, archivo)

        if not os.path.exists(ruta_completa):
            print(f"  [!] No se encontro el archivo: {ruta_completa}  (se omite)")
            continue

        print(f"  -> Leyendo {archivo} ...")
        registros = leer_archivo(ruta_completa, categoria)
        print(f"     {len(registros)} registros validos encontrados.")
        todos_los_registros.extend(registros)

    if not todos_los_registros:
        print("\nNo se encontraron registros para importar. Revisa RUTA_EXCEL.")
        return

    conexion = conectar()
    cursor = conexion.cursor()

    if LIMPIAR_TABLA_ANTES_DE_IMPORTAR:
        print("\nLimpiando tabla 'expedientes' antes de importar...")
        cursor.execute("TRUNCATE TABLE expedientes")
        conexion.commit()

    print(f"\nInsertando {len(todos_los_registros)} registros en la base de datos...")

    sql_insert = """
        INSERT INTO expedientes
            (categoria, expediente, tipo_orden, fecha_orden, juzgado, nombre, municipio, delito)
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
    """

    lote = 500
    total = len(todos_los_registros)
    for i in range(0, total, lote):
        cursor.executemany(sql_insert, todos_los_registros[i:i + lote])
        conexion.commit()
        print(f"  Insertados {min(i + lote, total)} / {total}")

    cursor.close()
    conexion.close()

    print("\n" + "=" * 60)
    print(" Importacion finalizada con exito.")
    print("=" * 60)


if __name__ == "__main__":
    importar()
