import os
import pymysql
import argparse
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
}


# ===============================
# OBTENER LEADS (últimos 7 días)
# ===============================
def fetch_leads_with_phone():
    conn = pymysql.connect(**DB_CONFIG)
    try:
        with conn.cursor() as cur:
            sql = """
                SELECT 
                    phone_norm_gen,
                    Nombre_cliente,
                    Apellido_cliente,
                    ID_cliente,
                    ID_medio_llegada,
                    Medio_llegada,
                    Rut_cliente,
                    Fecha_ingreso
                FROM Lead_entrantes
                WHERE phone_norm_gen IS NOT NULL 
                  AND phone_norm_gen != ''
                  AND Fecha_ingreso >= CURDATE() - INTERVAL 7 DAY
            """
            cur.execute(sql)
            return cur.fetchall()
    finally:
        conn.close()


# ===============================
# OBTENER UI (últimos 7 días)
# ===============================
def fetch_ui_record(phone):
    conn = pymysql.connect(**DB_CONFIG)
    try:
        with conn.cursor() as cur:
            cur.execute("""
                SELECT *
                FROM UserInteraction
                WHERE whatsapp_phone = %s
                  AND fecha_registro >= NOW() - INTERVAL 7 DAY
                LIMIT 1
            """, (phone,))
            return cur.fetchone()
    finally:
        conn.close()


# ===============================
# ACTUALIZACIÓN REAL
# ===============================
def update_ui_record(phone, updates):
    if not updates:
        return

    conn = pymysql.connect(**DB_CONFIG)
    try:
        with conn.cursor() as cur:
            set_clause = ", ".join([f"{field} = %s" for field in updates])
            values = list(updates.values())
            values.append(phone)

            sql = f"""
                UPDATE UserInteraction
                SET {set_clause}
                WHERE whatsapp_phone = %s
            """
            cur.execute(sql, values)
        conn.commit()
    finally:
        conn.close()


# ===============================
# FUNCIONES AUXILIARES
# ===============================
def is_empty(value):
    if value is None:
        return True
    if isinstance(value, int):
        return value == 0
    if isinstance(value, str):
        return value.strip() == ""
    return False


def is_really_empty(value):
    if value is None:
        return True
    if value == 0:
        return True
    if isinstance(value, str):
        v = value.strip()
        return v == "" or v == "0"
    return False


# ===============================
# PROCESO PRINCIPAL
# ===============================
def procesar(modo_test=False):
    leads = fetch_leads_with_phone()

    print(f"🔍 Leads de la última semana: {len(leads)}")
    print(f"🧪 MODO TEST: {'ACTIVADO' if modo_test else 'DESACTIVADO'}")

    for lead in leads:
        phone = lead["phone_norm_gen"]
        ui = fetch_ui_record(phone)

        if not ui:
            print(f"⚠️ No existe UI reciente para {phone}")
            continue

        updates = {}

        # Campo por campo
        if is_empty(ui["nombre_cliente"]) and lead["Nombre_cliente"]:
            updates["nombre_cliente"] = lead["Nombre_cliente"]

        if is_empty(ui["apellido_cliente"]) and lead["Apellido_cliente"]:
            updates["apellido_cliente"] = lead["Apellido_cliente"]

        if is_empty(ui["crm_id_cliente"]) and lead["ID_cliente"]:
            updates["crm_id_cliente"] = lead["ID_cliente"]

        if is_empty(ui["crm_medio_id"]) and lead["ID_medio_llegada"]:
            updates["crm_medio_id"] = lead["ID_medio_llegada"]

        # DNI protegido contra NULL / 0 / "0"
        if is_really_empty(ui.get("dni")) and lead.get("Rut_cliente"):
            updates["dni"] = lead["Rut_cliente"]

        # Medio de contacto
        if (
            is_empty(ui.get("crm_medio_id")) and
            lead.get("ID_medio_llegada") and
            is_empty(ui.get("medio_de_contacto")) and
            lead.get("Medio_llegada")
        ):
            updates["medio_de_contacto"] = lead["Medio_llegada"]

        if updates:
            print(f"✏️ {phone} → Actualizaría: {updates}")

            if not modo_test:
                update_ui_record(phone, updates)
                print("   ✔ Actualizado")
        else:
            print(f"✔ {phone} → Sin cambios necesarios")


# ===============================
# MAIN + ARGUMENTOS
# ===============================
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Sincronizar UI desde Lead_entrantes")
    parser.add_argument("--test", action="store_true", help="Modo test (no actualiza la BD)")
    args = parser.parse_args()

    procesar(modo_test=args.test)
