"""
Configuración del Agente de Seguimiento Comercial - Track Mar (División Repuestos)

Todo lo que hay que tocar para conectar el agente a los sistemas reales de Track Mar
está en este archivo (o en variables de entorno / archivo .env). La lógica del agente
(db.py, reglas.py, whatsapp.py, main.py) no debería necesitar cambios.

Ver el documento "Agente_Seguimiento_Comercial_TrackMar.docx", sección 9
(checklist de prerrequisitos técnicos), para la lista completa de lo que hace
falta antes de poner esto a correr con datos reales.
"""
import os

try:
    from dotenv import load_dotenv
    load_dotenv()
except ImportError:
    pass  # python-dotenv es opcional; también se puede correr con variables de entorno reales

# ---------------------------------------------------------------------------
# 1) BASE DE DATOS — acceso de SOLO LECTURA al sistema propio de Track Mar
# ---------------------------------------------------------------------------
DB_ENGINE = os.environ.get("DB_ENGINE", "postgresql")  # postgresql | mysql | mssql
DB_HOST = os.environ.get("DB_HOST", "CAMBIAR_HOST")
DB_PORT = os.environ.get("DB_PORT", "5432")
DB_NAME = os.environ.get("DB_NAME", "CAMBIAR_BASE")
DB_USER = os.environ.get("DB_USER", "CAMBIAR_USUARIO_SOLO_LECTURA")
DB_PASSWORD = os.environ.get("DB_PASSWORD", "CAMBIAR_PASSWORD")

DRIVERS = {
    "postgresql": "postgresql+psycopg2",
    "mysql": "mysql+mysqlconnector",
    "mssql": "mssql+pyodbc",
}


def get_connection_string() -> str:
    driver = DRIVERS.get(DB_ENGINE, DB_ENGINE)
    extra = "?driver=ODBC+Driver+17+for+SQL+Server" if DB_ENGINE == "mssql" else ""
    return f"{driver}://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}{extra}"


# ---------------------------------------------------------------------------
# 2) ESQUEMA REAL — sistema propio de Track Mar ("Utopia", MySQL).
#    Relevado directo contra la base el 2026-09-07. No es un esquema genérico:
#    las reglas de negocio de la sección 4 necesitan cruces entre varias tablas
#    que un diccionario tabla->columna no puede expresar, así que el SQL real
#    vive directo en db.py. Lo que sigue es la referencia de qué tabla/columna
#    corresponde a cada concepto, y las decisiones de mapeo ya validadas con
#    Osvaldo:
#
#    - Cotizaciones -> COTIZACIONES_EMITIDAS. Su columna ESTADO no es
#      abierta/ganada/perdida (eso asumía la v1 del documento): solo indica si
#      está autorizada internamente ('AUTORIZAR'/'AUTORIZADA'). El resultado
#      real sale de otras tablas:
#        - Ganada  -> existe una fila en VENTAS con VENTAS.COTIZACION = NUMERO
#        - Perdida -> existe una fila en VENTAS_PERDIDAS con COTIZACION = NUMERO
#          (por ítem, con MOTIVO obligatorio: COMPETENCIA/FALTA_STOCK/CALIDAD)
#        - Última actividad -> MAX(FECHA) en COTIZACIONES_GESTIONES para esa
#          cotización, o la fecha de creación si nunca tuvo ninguna gestión.
#    - Clientes -> CLIENTES. Tiene columna WHATSAPP dedicada (además de
#      TELEFONO/CELULAR) — se usa esa para el contacto directo.
#    - Sucursales -> SUCURSALES (filtrando TIPO='REAL'; TIPO='TRANSITO' son
#      buckets internos, ej. "Transferencia", no sucursales de verdad).
#      SUCURSALES.EMAIL_ALERTA es el email del encargado para las alertas.
#    - Visitas/contactos (Eje 2 y Eje 3) -> CLIENTES_VISITAS, una única tabla
#      que registra tanto llamados como visitas en persona, distinguidos por
#      TIPO: '02' = llamado telefónico, '01'/'04' = visita en persona (sin/con
#      acompañamiento gerencial). Confirmado con Osvaldo el 2026-09-07.
#        - Eje 3 (contacto en frío sin cotización): el campo COTIZACIONES
#          de CLIENTES_VISITAS resultó no confiable (cargado en <1% de los
#          llamados, y con fechas que no coinciden con la del llamado). En su
#          lugar, "generó cotización" se determina cruzando por CLIENTE y
#          ventana de tiempo contra COTIZACIONES_EMITIDAS.FECHA.
#        - Eje 2 (visitas): no existe en este esquema el estado intermedio
#          "visita cargada sin resultado" que asumía la v1 del documento —
#          cargar la visita y su resultado son el mismo acto acá. Redefinido
#          como: una gira planificada en CLIENTES_GIRA (ventana
#          FECHA_INICIO/FECHA_CIERRE por cliente) que se vence sin ningún
#          CLIENTES_VISITAS (TIPO en '01'/'04') para ese cliente en esa
#          ventana. Confirmado con Osvaldo el 2026-09-07.
# ---------------------------------------------------------------------------

# ---------------------------------------------------------------------------
# 3) UMBRALES — mismos puntos de partida que la planilla de diagnóstico
#    (Diagnostico_Comercial_TrackMar.xlsx). Ajustables sin tocar el resto del código.
# ---------------------------------------------------------------------------
# Eje 1 — esquema de 3 niveles definido con Osvaldo el 2026-09-07 (ver
# db.py::obtener_cotizaciones_sin_seguimiento para el detalle de cada nivel):
UMBRAL_HORAS_COTIZACION_SIN_PRIMER_CONTACTO = 12   # nunca_contactada
UMBRAL_HORAS_COTIZACION_SIN_NOVEDAD = 48           # sin_novedad (ya tuvo contacto)
UMBRAL_DIAS_COTIZACION_ESCALAMIENTO = 7            # escalamiento (ya tuvo contacto, sigue frio)
UMBRAL_HORAS_CONTACTO_FRIO_SIN_COTIZACION = 48
UMBRAL_DIAS_HABILES_VISITA_SIN_RESULTADO = 1
OBJETIVO_CONTACTOS_FRIO_POR_MES = 200
UMBRAL_PROYECCION_CONTACTOS = 0.90          # alerta si el ritmo proyectado cae por debajo del 90% del objetivo
DIAS_MINIMOS_ENTRE_MENSAJES_AL_MISMO_CLIENTE = 5  # anti-duplicados / anti-spam

# ---------------------------------------------------------------------------
# 4) WHATSAPP BUSINESS API (Meta Cloud API)
# ---------------------------------------------------------------------------
WHATSAPP_TOKEN = os.environ.get("WHATSAPP_TOKEN", "CAMBIAR_TOKEN")
WHATSAPP_PHONE_NUMBER_ID = os.environ.get("WHATSAPP_PHONE_NUMBER_ID", "CAMBIAR_PHONE_NUMBER_ID")
WHATSAPP_API_VERSION = os.environ.get("WHATSAPP_API_VERSION", "v19.0")

# Nombres de las plantillas ya aprobadas por Meta (ver sección 6 y 9 del documento .docx)
PLANTILLA_SEGUIMIENTO_COTIZACION = os.environ.get("PLANTILLA_SEGUIMIENTO_COTIZACION", "CAMBIAR_nombre_plantilla_cotizacion")
PLANTILLA_CONTACTO_FRIO = os.environ.get("PLANTILLA_CONTACTO_FRIO", "CAMBIAR_nombre_plantilla_contacto_frio")
WHATSAPP_IDIOMA_PLANTILLA = os.environ.get("WHATSAPP_IDIOMA_PLANTILLA", "es_AR")

# ---------------------------------------------------------------------------
# 5) PILOTO — sucursales habilitadas para contacto DIRECTO a clientes por WhatsApp.
#    El resto de las sucursales sigue recibiendo detección + avisos internos,
#    pero el agente NO les manda mensajes a sus clientes hasta que se agreguen acá.
#    Ver sección 10 del documento (recomendación de arranque en piloto).
# ---------------------------------------------------------------------------
SUCURSALES_PILOTO_CONTACTO_CLIENTE = [
    # Usar el nombre tal cual está en SUCURSALES.NOMBRE (sin tildes, ej. "Neuquen").
    # "Neuquen", "Mendoza",
]
CONTACTO_CLIENTE_HABILITADO_PARA_TODAS = False  # poner en True para salir del piloto y activar en todas

# ---------------------------------------------------------------------------
# 6) DESTINATARIOS INTERNOS de los reportes (diario + resumen semanal)
# ---------------------------------------------------------------------------
DESTINATARIOS_GERENCIALES = [
    {"nombre": "Osvaldo", "email": "osvaldo.bianchi@trackmar.com.ar", "whatsapp": None},
    # {"nombre": "Diego Starosta", "email": "CAMBIAR", "whatsapp": None},
    # {"nombre": "Sebastián", "email": "CAMBIAR", "whatsapp": None},
]

# ---------------------------------------------------------------------------
# 7) MODO DE EJECUCIÓN
# ---------------------------------------------------------------------------
DRY_RUN = os.environ.get("DRY_RUN", "true").lower() == "true"
LOG_PATH = os.environ.get("LOG_PATH", "registro_acciones.csv")
