import os
import pymysql
import requests
import argparse
from datetime import datetime
from dotenv import load_dotenv

load_dotenv()

DB_CONFIG = {
    "host": os.getenv("DB_HOST"),
    "user": os.getenv("DB_USER"),
    "password": os.getenv("DB_PASSWORD"),
    "database": os.getenv("DB_NAME"),
    "cursorclass": pymysql.cursors.DictCursor
}

CHATFUEL_BOT_ID_B = os.getenv("CHATFUEL_BOT_ID_B")
CHATFUEL_TOKEN_B = os.getenv("CHATFUEL_TOKEN_B")

CHATFUEL_URL = f"https://api.chatfuel.com/whatsapp/bots/{CHATFUEL_BOT_ID_B}/contacts?chatfuel_token={CHATFUEL_TOKEN_B}"
HEADERS = {"Content-Type": "application/json"}

# ✅ NUEVO: PROYECTOS_ACTIVO desde .env (ej: "1" o "1,2,10")
PROYECTOS_ACTIVO_STR = (os.getenv("PROYECTOS_ACTIVO") or "").strip()

def parse_proyectos_activo(s: str):
    if not s:
        return []
    out = []
    for p in s.split(","):
        p = p.strip()
        if not p:
            continue
        try:
            out.append(int(p))
        except ValueError:
            # ignora valores inválidos
            pass
    return out

PROYECTOS_ACTIVO = parse_proyectos_activo(PROYECTOS_ACTIVO_STR)


def fetch_candidatos(limit=50):
    # Si no hay proyectos activos definidos, no envía nada (más seguro)
    if not PROYECTOS_ACTIVO:
        print("⛔ PROYECTOS_ACTIVO vacío o inválido en .env (ej: '1,2,10'). No se enviará nada.")
        return []

    placeholders = ",".join(["%s"] * len(PROYECTOS_ACTIVO))

    conn = pymysql.connect(**DB_CONFIG)
    try:
        with conn.cursor() as cur:
            sql = f"""
                SELECT l.*
                FROM Lead_entrantes l
                JOIN (
                    SELECT
                        phone_norm_gen,
                        DATE(`Now`) AS dia,
                        MAX(`Now`) AS max_now
                    FROM Lead_entrantes
                    WHERE phone_norm_gen IS NOT NULL
                      AND phone_norm_gen != ''
                      AND `Now` BETWEEN NOW() - INTERVAL 5 HOUR
                                    AND NOW() - INTERVAL 130 MINUTE
                      AND IFNULL(enviado_ruta_b,0) = 0
                      AND CAST(ID_proyecto AS UNSIGNED) IN ({placeholders})
                    GROUP BY phone_norm_gen, DATE(`Now`)
                ) x
                  ON x.phone_norm_gen = l.phone_norm_gen
                 AND x.dia = DATE(l.`Now`)
                 AND x.max_now = l.`Now`
                WHERE
                    CAST(l.ID_proyecto AS UNSIGNED) IN ({placeholders})
                    AND NOT EXISTS (
                        SELECT 1
                        FROM UserInteraction ui
                        WHERE ui.whatsapp_phone = l.phone_norm_gen
                          AND ui.fecha_registro >= NOW() - INTERVAL 48 HOUR
                    )
                LIMIT %s
            """
            # placeholders aparecen 2 veces: subquery + query final
            params = list(PROYECTOS_ACTIVO) + list(PROYECTOS_ACTIVO) + [int(limit)]
            cur.execute(sql, params)
            return cur.fetchall()
    finally:
        conn.close()


def enviar_chatfuel_ruta_b(lead):
    phone = (lead.get("phone_norm_gen") or "").strip()

    def safe(v):
        return "" if v is None else str(v)

    payload = {
        "phone": phone,
        "attributes": {
            "whatsapp_phone": phone,

            "crm Fecha_ingreso": safe(lead.get("Fecha_ingreso")),
            "crm Hora_ingreso": safe(lead.get("Hora_ingreso")),
            "crm ID_centralizador": safe(lead.get("ID_centralizador")),
            "crm Estado": safe(lead.get("Estado")),

            "crm ID_cliente": safe(lead.get("ID_cliente")),
            "crm_ID_cliente": safe(lead.get("ID_cliente")),

            "crm medio id": safe(lead.get("ID_medio_llegada")),
            "crm Medio_llegada": safe(lead.get("Medio_llegada")),

            "crm Rut_cliente": safe(lead.get("Rut_cliente")),
            "crm Nombre_cliente": safe(lead.get("Nombre_cliente")),
            "crm Apellido_cliente": safe(lead.get("Apellido_cliente")),

            "crm Proyecto": safe(lead.get("Proyecto")),
            "crm ID_proyecto": safe(lead.get("ID_proyecto")),

            "crm Nombre_vendedor": safe(lead.get("Nombre_vendedor")),
            "crm Email_vendedor": safe(lead.get("Email_vendedor")),
            "crm Rut_vendedor": safe(lead.get("Rut_vendedor")),

            "crm Email_cliente": safe(lead.get("Email_cliente")),

            "Activar_contacto": True
        },
        "invokeTriggers": True,
        "tagNames": ["Nuevo_lead"]
    }

    try:
        r = requests.post(
            CHATFUEL_URL,
            json=payload,
            headers=HEADERS,
            timeout=20
        )

        if r.status_code != 200:
            return False, f"HTTP {r.status_code}: {r.text[:400]}"

        return True, None

    except Exception as e:
        return False, f"{type(e).__name__}: {e}"

def marcar_enviado_por_dia(phone, dia):
    """
    Marca como enviados TODOS los Lead_entrantes del mismo teléfono
    en el mismo día (DATE(Now) = dia).
    """
    conn = pymysql.connect(**DB_CONFIG)
    try:
        with conn.cursor() as cur:
            cur.execute(
                """
                UPDATE Lead_entrantes
                SET enviado_ruta_b = 1,
                    fecha_envio_ruta_b = NOW()
                WHERE phone_norm_gen = %s
                  AND DATE(`Now`) = %s
                """,
                (phone, dia)
            )
        conn.commit()
    finally:
        conn.close()


def procesar(modo_test=False, limit=50, marcar_en_test=False):
    # Validación básica de config Chatfuel
    if not CHATFUEL_BOT_ID_B or not CHATFUEL_TOKEN_B:
        print("⛔ Falta CHATFUEL_BOT_ID_B o CHATFUEL_TOKEN_B en .env")
        return

    print(f"🎯 PROYECTOS_ACTIVO: {PROYECTOS_ACTIVO}")

    leads = fetch_candidatos(limit=limit)
    print(f"🚀 A enviar ruta B: {len(leads)}")
    print(f"🧪 MODO TEST: {'ACTIVADO' if modo_test else 'DESACTIVADO'}")

    enviados_ok = 0
    errores = 0

    for lead in leads:
        phone = (lead.get("phone_norm_gen") or "").strip()

        now_val = lead.get("Now") or lead.get("now")
        if isinstance(now_val, str):
            # Ajusta este formato si tu MySQL devuelve otro
            now_val = datetime.strptime(now_val, "%Y-%m-%d %H:%M:%S")
        dia = now_val.date() if now_val else None

        ok, err = enviar_chatfuel_ruta_b(lead)

        if ok:
            enviados_ok += 1
            print(f"✔ Enviado: {phone} (día {dia})")

            # En test, por defecto NO marcamos en DB (para que puedas probar sin bloquear)
            if (not modo_test) or marcar_en_test:
                if dia:
                    marcar_enviado_por_dia(phone, dia)
                else:
                    print("   ⚠️ No pude obtener día desde l.Now; no se marcó en BD")
        else:
            errores += 1
            print(f"❌ Error: {phone} → {err}")

        # Modo test: solo 1 envío y fin
        if modo_test:
            print("🧪 TEST → se detiene tras 1 envío")
            break

    print(f"✅ OK: {enviados_ok} | ❌ Errores: {errores}")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Ruta B: reenviar a Chatfuel si no hay UI tras 16h (filtrado por PROYECTOS_ACTIVO)")
    parser.add_argument("--test", action="store_true", help="Envía solo 1 y se detiene")
    parser.add_argument("--limit", type=int, default=50, help="Máximo de candidatos por ejecución")
    parser.add_argument(
        "--mark-in-test",
        action="store_true",
        help="En modo test también marca como enviado en BD (por defecto NO marca)"
    )
    args = parser.parse_args()

    procesar(modo_test=args.test, limit=args.limit, marcar_en_test=args.mark_in_test)