import logging
import sys
import os
import difflib

BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
sys.path.insert(0, BASE_DIR)
from helpers.db import conectar
from helpers.logging_setup import setup_logging

setup_logging("socios_accionistas")

conn = conectar()
cursor = conn.cursor()

# ----------------------------
# Traer tabla cargos
# ----------------------------
cursor.execute("""
    SELECT car_codigo, car_nombre, car_nombre_2, car_nombre_3, car_nombre_4, car_nombre_5 
    FROM cargos
""")
rows_cargos = cursor.fetchall()

# Armar diccionario {nombre_normalizado: codigo}
cargos_dict = {}
for row in rows_cargos:
    codigo = row.car_codigo
    for nombre in [row.car_nombre, row.car_nombre_2, row.car_nombre_3, row.car_nombre_4, row.car_nombre_5]:
        if nombre:
            cargos_dict[nombre.strip().upper()] = codigo

# ----------------------------
# Función que mapea el cargo
# ----------------------------
def mapear_cargo(texto_cargo, cargos_dict, cutoff=0.7):
    if not texto_cargo:
        return 'OTRO'

    mejor_codigo = None
    mejor_score = 0.0

    for variante, codigo in cargos_dict.items():
        score = difflib.SequenceMatcher(None, texto_cargo.upper(), variante.upper()).ratio()
        if score > mejor_score:
            mejor_score = score
            mejor_codigo = codigo

    return mejor_codigo if mejor_score >= cutoff else 'OTRO'

# ----------------------------
# Traer registros de personas con cargo distinto a socio
# ----------------------------
cursor.execute("{CALL data_tablas_edictos_update (?)}", 'update_personas_no_socios')
rows = cursor.fetchall()

def _val(v):
    if v is None:
        return None
    s = str(v).strip()
    return s if s else None


for row in rows:
    if not row.cargo:
        cargo_mapeado = None
    else:
        cargo_mapeado = mapear_cargo(row.cargo, cargos_dict)
    logging.debug(f"CARGO_MAPEADO | id={row.id} cargo='{row.cargo}' mapeado='{cargo_mapeado}'")

    params = (
        row.id,
        row.id_fide,
        None,
        None,
        row.fecha_publicacion,
        row.documento_soc,
        _val(row.cuit),
        _val(row.apellido_nombre),
        _val(row.domicilio),
        _val(row.estado_civil),
        _val(row.conyuge),
        cargo_mapeado,
        "SI" if row.permanece_en_cargo and str(row.permanece_en_cargo).lower() in ["si", "sí"] else "NO",
        row.created_by,
        row.id_padron_sociedad,
        row.id_padron_integrante
    )
    logging.debug(f"SP_EJECUTADO | edictos_ia_procesar_directivos id={row.id} id_fide={row.id_fide}")
    cursor.execute("{CALL edictos_ia_procesar_directivos (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}", params)

conn.commit()
cursor.close()
conn.close()
