import os
import pymysql
import json
import requests
import time

from dotenv import load_dotenv

load_dotenv()

# ============================
# CONFIGURACIÓN DESDE ENV
# ============================
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 = os.getenv("CHATFUEL_BOT_ID")
CHATFUEL_TOKEN = os.getenv("CHATFUEL_TOKEN")

CHATFUEL_URL = (
    f"https://api.chatfuel.com/whatsapp/bots/"
    f"{CHATFUEL_BOT_ID}/contacts?chatfuel_token={CHATFUEL_TOKEN}"
)

HEADERS = {"Content-Type": "application/json"}

# ============================
# PROYECTOS ACTIVOS (ENV)
# Ej: PROYECTOS_ACTIVO=6,9
# ============================
PROYECTOS_ACTIVO_STR = os.getenv("PROYECTOS_ACTIVO", "")
PROYECTOS_ACTIVO = set()
if PROYECTOS_ACTIVO_STR.strip():
    try:
        PROYECTOS_ACTIVO = {int(x.strip()) for x in PROYECTOS_ACTIVO_STR.split(",") if x.strip()}
    except ValueError:
        PROYECTOS_ACTIVO = set()


# ============================
# OBTENER LEADS A PROCESAR
# ============================
def fetch_leads():
    conn = pymysql.connect(**DB_CONFIG)
    try:
        with conn.cursor() as cur:
            base_sql = """
                SELECT ID_centralizador, phone_norm_gen
                FROM Lead_entrantes
                WHERE Estado_telefono IS NULL
            """

            params = []
            if PROYECTOS_ACTIVO:
                # Armamos placeholders (%s,%s,%s...) según cantidad de proyectos
                placeholders = ",".join(["%s"] * len(PROYECTOS_ACTIVO))
                base_sql += f" AND ID_proyecto IN ({placeholders})"
                params.extend(list(PROYECTOS_ACTIVO))

            cur.execute(base_sql, params)
            return cur.fetchall()
    finally:
        conn.close()


# ============================
# GUARDAR RESPUESTA
# ============================
def save_response(id_centralizador, respuesta_cf):
    conn = pymysql.connect(**DB_CONFIG)
    try:
        with conn.cursor() as cur:
            sql = """
                UPDATE Lead_entrantes
                SET Estado_telefono = %s
                WHERE ID_centralizador = %s
            """
            cur.execute(sql, (str(respuesta_cf), id_centralizador))
        conn.commit()
    finally:
        conn.close()


# ============================
# ENVIAR A CHATFUEL
# ============================
def enviar_chatfuel(phone):
    payload = {
        "phone": phone or "",
        "attributes": {
            "whatsapp_phone": phone or "",
            "actualizado": "Actualizado"
        },
        "tagNames": ["Nuevo_lead"]
    }

    try:
        r = requests.post(CHATFUEL_URL, data=json.dumps(payload), headers=HEADERS)
        return {
            "status_code": r.status_code,
            "text": r.text
        }
    except Exception as e:
        return {"error": str(e)}


# ============================
# PROCESO PRINCIPAL
# ============================
def procesar():
    leads = fetch_leads()

    print(f"🔍 Leads pendientes por enviar: {len(leads)}")
    if PROYECTOS_ACTIVO:
        print(f"📌 Filtrando por ID_proyecto en: {sorted(PROYECTOS_ACTIVO)}")
    else:
        print("📌 Sin filtro de proyectos (PROYECTOS_ACTIVO vacío o inválido)")

    contador = 0

    for lead in leads:
        id_centralizador = lead["ID_centralizador"]
        phone = lead["phone_norm_gen"]

        print(f"📤 Enviando a Chatfuel → ID {id_centralizador}, phone={phone}")

        resp = enviar_chatfuel(phone)

        print(f"   → Respuesta Chatfuel: {resp}")

        save_response(id_centralizador, json.dumps(resp))

        contador += 1

        # Cada 100 envíos → descanso adicional
        if contador % 100 == 0:
            print("⏳ Descanso: 100 envíos completados, esperando 5 Segundos...")
            time.sleep(5)


if __name__ == "__main__":
    procesar()
