#!/usr/bin/env python3
"""
Atualiza os 60 contatos da Fesqua no GHL Sweet Angels com dados enriquecidos.
"""
import json
import time
import urllib.request
import urllib.error
from datetime import datetime

TOKEN = "pit-5c81b5cf-19ef-4b6d-8d90-2df3a3e054b7"
LOCATION_ID = "4z6Fjpgj2soAQZpu8Ddk"

ENRICHED_FILE = "/opt/mia/workspace/prospeccao_ativa/enriq_leads/f29a0543.json"
ENVIO_FILE = "/opt/mia/workspace/clientes/sweet_angels/fesqua_envio_linkia.json"
LOG_FILE = "/opt/mia/workspace/clientes/sweet_angels/fesqua_update_campos.json"

# IDs dos custom fields (obtidos via GET /locations/{id}/customFields)
CF = {
    "facebook_url": "0wnPrPvRnH0TM4RDf5H9",
    "decisor_cargo": "42XmykBk5o1JzL2YgcHn",
    "fontes": "5h6WOTvC5ZNrZhcuzQVL",
    "linkedin_url": "AhzLozPJlwPMrNRGmOvs",
    "site": "HTynXy6CmQBknlpaGxBH",
    "cnpj": "OXuuJ2qaOS3Rft8yYYbM",
    "instagram": "hGNaQL49126z2H8R1nfl",
    "decisor_nome": "yQn9XjbldhCuAQ2QBhEl",
}

HEADERS = {
    "Authorization": f"Bearer {TOKEN}",
    "Version": "2021-07-28",
    "Content-Type": "application/json",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
}


def normalize_name(n: str) -> str:
    return (n or "").strip().upper()


def http_put(url: str, body: dict) -> tuple[int, dict]:
    data = json.dumps(body).encode("utf-8")
    req = urllib.request.Request(url, data=data, headers=HEADERS, method="PUT")
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            code = resp.getcode()
            payload = json.loads(resp.read().decode("utf-8") or "{}")
            return code, payload
    except urllib.error.HTTPError as e:
        try:
            payload = json.loads(e.read().decode("utf-8") or "{}")
        except Exception:
            payload = {"error": str(e)}
        return e.code, payload
    except Exception as e:
        return 0, {"error": str(e)}


def build_body(lead: dict) -> tuple[dict, list[str]]:
    body: dict = {}
    campos_preenchidos: list[str] = []

    # Campos padrão
    email = (lead.get("email") or "").strip()
    if email:
        body["email"] = email
        campos_preenchidos.append("email")

    site = (lead.get("site") or "").strip()
    if site:
        body["website"] = site
        campos_preenchidos.append("website")

    # Custom fields
    custom = []

    def add_cf(key: str, value: str, label: str):
        v = (value or "").strip()
        if v:
            custom.append({"id": CF[key], "value": v})
            campos_preenchidos.append(label)

    add_cf("cnpj", lead.get("cnpj", ""), "cnpj")
    add_cf("site", lead.get("site", ""), "cf_site")
    add_cf("instagram", lead.get("instagram", ""), "instagram")
    add_cf("facebook_url", lead.get("facebook", ""), "facebook")
    add_cf("decisor_nome", lead.get("decisor_nome", ""), "decisor_nome")
    add_cf("decisor_cargo", lead.get("decisor_cargo", ""), "decisor_cargo")

    # LinkedIn: prefere linkedin_url; se vazio, usa linkedin_empresa
    linkedin = (lead.get("linkedin_url") or "").strip() or (lead.get("linkedin_empresa") or "").strip()
    if linkedin:
        custom.append({"id": CF["linkedin_url"], "value": linkedin})
        campos_preenchidos.append("linkedin_url")

    # Fontes: pode ser lista ou string
    fontes = lead.get("fontes")
    if isinstance(fontes, list):
        fontes_str = ", ".join([str(x) for x in fontes if x])
    else:
        fontes_str = (fontes or "").strip()
    if fontes_str:
        custom.append({"id": CF["fontes"], "value": fontes_str})
        campos_preenchidos.append("fontes")

    if custom:
        body["customFields"] = custom

    return body, campos_preenchidos


def main():
    with open(ENRICHED_FILE, "r", encoding="utf-8") as f:
        enriched = json.load(f)
    with open(ENVIO_FILE, "r", encoding="utf-8") as f:
        envio = json.load(f)

    # Index enriched por nome normalizado
    by_name: dict[str, dict] = {}
    for lead in enriched:
        by_name[normalize_name(lead.get("nome", ""))] = lead

    resultados = []
    ok, fail, sem_match = 0, 0, 0
    campos_totais: dict[str, int] = {}

    for i, s in enumerate(envio.get("sucessos", []), 1):
        nome = s.get("nome", "")
        contact_id = s.get("contact_id", "")
        lead = by_name.get(normalize_name(nome))

        if not lead:
            sem_match += 1
            resultados.append({
                "nome": nome,
                "contact_id": contact_id,
                "status": "sem_match_enriquecido",
            })
            print(f"[{i}/60] SEM MATCH: {nome}")
            continue

        body, campos = build_body(lead)
        if not body:
            resultados.append({
                "nome": nome,
                "contact_id": contact_id,
                "status": "sem_dados_para_atualizar",
            })
            print(f"[{i}/60] SEM DADOS: {nome}")
            continue

        url = f"https://services.leadconnectorhq.com/contacts/{contact_id}"
        code, resp = http_put(url, body)

        if code in (200, 201):
            ok += 1
            for c in campos:
                campos_totais[c] = campos_totais.get(c, 0) + 1
            resultados.append({
                "nome": nome,
                "contact_id": contact_id,
                "status": "ok",
                "http": code,
                "campos_atualizados": campos,
            })
            print(f"[{i}/60] OK: {nome} ({len(campos)} campos)")
        else:
            fail += 1
            resultados.append({
                "nome": nome,
                "contact_id": contact_id,
                "status": "erro",
                "http": code,
                "response": resp,
                "campos_tentados": campos,
            })
            print(f"[{i}/60] ERRO {code}: {nome} - {resp}")

        time.sleep(0.5)

    log = {
        "timestamp": datetime.utcnow().isoformat() + "Z",
        "location_id": LOCATION_ID,
        "total_processados": len(envio.get("sucessos", [])),
        "atualizados_ok": ok,
        "erros": fail,
        "sem_match_enriquecimento": sem_match,
        "campos_preenchidos_agregado": campos_totais,
        "detalhes": resultados,
    }
    with open(LOG_FILE, "w", encoding="utf-8") as f:
        json.dump(log, f, indent=2, ensure_ascii=False)

    print("\n=== RESUMO ===")
    print(f"OK: {ok}")
    print(f"Erros: {fail}")
    print(f"Sem match no enriquecimento: {sem_match}")
    print(f"Agregado por campo: {campos_totais}")
    print(f"Log: {LOG_FILE}")


if __name__ == "__main__":
    main()
