"""Configuración central: credenciales, URLs y utilidades de normalización."""
import os
import unicodedata
from dotenv import load_dotenv

load_dotenv()

RUT = os.getenv("INSICO_RUT", "")
PASS = os.getenv("INSICO_PASS", "")
LOGIN_URL = os.getenv("INSICO_LOGIN_URL", "")
FORM_URL = os.getenv("INSICO_FORM_URL", "")
REC_URL = os.getenv(
    "INSICO_REC_URL",
    "https://lapintanaqa.insico.cl/Personal_Salud/UI_Personal/WebRecuperacionLicenciaMedica.aspx")

# Portal Licencia Médica Electrónica del empleador (tramitación oficial)
LME_USER = os.getenv("LME_USER", "")
LME_PASS = os.getenv("LME_PASS", "")
LME_LOGIN_URL = os.getenv("LME_LOGIN_URL", "https://tramitacion.lmempleador.gob.cl/login")
LME_BANDEJA_URL = os.getenv("LME_BANDEJA_URL", "https://tramitacion.lmempleador.gob.cl/tramitacion")
EXCEL_PATH = os.getenv("EXCEL_PATH", "PRUEBA AUTOM. LIC. MED..xlsx")

# Acceso a la aplicación web (login)
APP_USUARIO = os.getenv("APP_USUARIO", "admin")
APP_CLAVE = os.getenv("APP_CLAVE", "153611")
APP_SECRET_KEY = os.getenv("APP_SECRET_KEY", "clave-secreta-por-defecto-cambiar")

# --- Selectores del formulario de Ingreso de Licencias Médicas ---
SEL = {
    # Login
    "login_rut": "#input_rut",
    "login_pass": "#input_pass",
    "login_btn": "#btn_valida",
    "sistema_personal_salud": "#Grilla_Sistemas_btn_acceder_0",
    # Cabecera (carga del funcionario)
    "rut": "#ContentPlaceHolder1_input_rut",
    "fecha_emision": "#ContentPlaceHolder1_input_fechaPrincipalLic",
    "btn_continuar": "#ContentPlaceHolder1_B_Ingresar",
    "nombre": "#ContentPlaceHolder1_input_nombre",
    # Datos de la licencia
    "num_licencia": "#ContentPlaceHolder1_input_numeroLicencia",
    "folio_tesoreria": "#ContentPlaceHolder1_input_folio_tesoreria",
    "dias": "#ContentPlaceHolder1_input_diaLicencia",
    "fecha_inicio": "#ContentPlaceHolder1_input_fecha_inicio",
    "fecha_fin": "#ContentPlaceHolder1_input_fecha_fin",  # se autocalcula
    "tipo_licencia": "#ContentPlaceHolder1_ddl_tipoLicencia",
    # Profesional
    "check_sel_profesional": "#ContentPlaceHolder1_check_seleccionProfesional",
    "rut_profesional": "#ContentPlaceHolder1_input_rutProfesional",
    "prof_nombre1": "#input_PrimernombreProfesional",
    "prof_nombre2": "#input_SegundonombreProfesional",
    "prof_apat": "#input_ApellidoPaternoProfesional",
    "prof_amat": "#input_ApellidoMaternoProfesional",
    "especialidad": "#ddl_especialidad",
    # Previsión / reposo
    "isapre": "#ContentPlaceHolder1_ddl_isapre",
    "tipo_reposo": "#ContentPlaceHolder1_ddl_tipoReposo",
    "jornada": "#ContentPlaceHolder1_ddl_jornada",
    # Cálculo de recuperación
    "btn_calcular": "#ContentPlaceHolder1_B_CalculaRecup",
    "dias_calculados": "#ContentPlaceHolder1_input_dias_calculados",
    "total_subsidio": "#ContentPlaceHolder1_input_totalSubsidio",
    "total_cotizacion": "#ContentPlaceHolder1_input_totalCotizacion",
    "valor_recuperacion": "#ContentPlaceHolder1_input_valorRecuperacion",
    # Guardar
    "btn_grabar": "#ContentPlaceHolder1_B_Grabar",
    "btn_cobro_sil": "#ContentPlaceHolder1_B_CobroSIL",
}


# --- Selectores de "Recuperación de Licencia Médica" (WebRecuperacionLicenciaMedica.aspx) ---
SEL_REC = {
    # Buscador (Consulta -> RUT -> Buscar -> grilla)
    "btn_consulta": "#ContentPlaceHolder1_B_MuestraBuscador",
    "busca_rut": "#ContentPlaceHolder1_txt_cod_busqueda",
    "btn_buscar": "#ContentPlaceHolder1_B_Buscar",
    "grilla": "#ContentPlaceHolder1_Grilla_Busqueda",
    # Datos de la licencia cargada (solo lectura)
    "nombre": "#ContentPlaceHolder1_input_nombre",
    "num_licencia": "#ContentPlaceHolder1_input_numeroLicencia",
    "dias_licencia": "#ContentPlaceHolder1_input_diaLicencia",
    "total_subsidio": "#ContentPlaceHolder1_input_totalSubsidio1",
    "total_cotizacion": "#ContentPlaceHolder1_input_totalCotizacion1",
    "valor_recuperacion": "#ContentPlaceHolder1_input_valorRecuperacion1",
    # Detalle del Pago (se digita desde el Excel)
    "radio_total": "#ContentPlaceHolder1_radio_recuperacion_0",     # T
    "radio_parcial": "#ContentPlaceHolder1_radio_recuperacion_1",   # P
    "tipo_pago": "#ContentPlaceHolder1_ddl_TipoPagoDetalle",        # Transferencia / Pago Cheque / Vale Vista
    "banco": "#ContentPlaceHolder1_ddl_banco_detalle",
    "ncheque": "#ContentPlaceHolder1_input_Ncheque_detalle",
    "fecha_pago": "#ContentPlaceHolder1_calendar_fechaPago",
    "dias_subsidio": "#ContentPlaceHolder1_input_dias_subsidio",
    "valor_subsidio": "#ContentPlaceHolder1_input_valor_subsidio",
    "dias_cotizacion": "#ContentPlaceHolder1_input_dias_cotizacion",
    "valor_cotizacion": "#ContentPlaceHolder1_input_valor_cotizacion",
    "valor_interes": "#ContentPlaceHolder1_input_valor_interes",
    "valor_multa": "#ContentPlaceHolder1_input_valor_multa",
    "observacion": "#ContentPlaceHolder1_input_observacion",
    "btn_graba_detalle": "#ContentPlaceHolder1_btn_graba_detalle",
}


def limpiar_num_licencia(valor):
    """El N° de licencia va sin guión ni dígito verificador: '129356046-K' -> '129356046'."""
    return str(valor or "").split("-")[0].strip()


def rut_valido(rut):
    """Valida un RUT chileno (formato + dígito verificador, módulo 11)."""
    s = str(rut or "").strip().upper().replace(".", "").replace("-", "").replace(" ", "")
    if len(s) < 2:
        return False
    cuerpo, dv = s[:-1], s[-1]
    if not cuerpo.isdigit():
        return False
    suma, factor = 0, 2
    for c in reversed(cuerpo):
        suma += int(c) * factor
        factor = 2 if factor == 7 else factor + 1
    resto = 11 - (suma % 11)
    dv_calc = "0" if resto == 11 else "K" if resto == 10 else str(resto)
    return dv == dv_calc


def mapear_jornada(valor):
    """Convierte el valor de la columna Jornada del Excel a la opción del formulario.
    'AM' -> MAÑANA, 'PM' -> TARDE. Devuelve '' si no aplica (ej. reposo TOTAL)."""
    v = normaliza(valor)
    if v in ("am", "manana", "a.m.", "am."):
        return "MAÑANA"
    if v in ("pm", "tarde", "p.m.", "pm."):
        return "TARDE"
    return ""


def es_parcial(tipo_reposo):
    return "parcial" in normaliza(tipo_reposo)


def partir_nombre_completo_profesional(nombre):
    """Parte 'APELLIDO_PATERNO APELLIDO_MATERNO NOMBRES' en
    (primer_nombre, segundo_nombre, apellido_paterno, apellido_materno).
    Se usa para REGISTRAR un profesional que no existe en el sistema."""
    t = str(nombre or "").split()
    n = len(t)
    if n == 0:
        return ("", "", "", "")
    if n == 1:
        return (t[0], "", "", "")
    if n == 2:
        return (t[1], "", t[0], "")            # PATERNO NOMBRE
    if n == 3:
        return (t[2], "", t[0], t[1])          # PATERNO MATERNO NOMBRE
    return (t[2], " ".join(t[3:]), t[0], t[1])  # PATERNO MATERNO NOMBRE1 NOMBRE2...


def partir_nombre_profesional(nombre):
    """El Excel trae 'APELLIDO_PATERNO APELLIDO_MATERNO NOMBRES'.
    Devuelve (paterno, materno)."""
    tokens = str(nombre or "").split()
    paterno = tokens[0] if len(tokens) >= 1 else ""
    materno = tokens[1] if len(tokens) >= 2 else ""
    return paterno, materno


def normaliza(texto) -> str:
    """Minúsculas, sin tildes ni espacios extra. Para comparar textos de forma robusta."""
    if texto is None:
        return ""
    s = str(texto).strip().lower()
    s = unicodedata.normalize("NFD", s)
    s = "".join(c for c in s if unicodedata.category(c) != "Mn")
    return " ".join(s.split())
