#!/usr/bin/env python3
"""
Patch: atualiza contatos já importados com os custom fields que ficaram null
no field_map da primeira rodada (campos que deram 400 "already exists" com existingId).
"""

import json
import time
import re
import openpyxl
import requests
from datetime import datetime, date

TOKEN = "pit-5c81b5cf-19ef-4b6d-8d90-2df3a3e054b7"
LOC   = "4z6Fjpgj2soAQZpu8Ddk"
BASE  = "https://services.leadconnectorhq.com"
HEADERS = {
    "Authorization": f"Bearer {TOKEN}",
    "Version": "2021-07-28",
    "Content-Type": "application/json"
}

XLSX        = "/opt/mia/workspace/clientes/sweet_angels/sdr_medio_porte/dados/base_prospeccao_300.xlsx"
RESULT_PATH = "/opt/mia/workspace/clientes/sweet_angels/sdr_medio_porte/medio_porte_envio_linkia.json"
FIELD_MAP_CORRECT = "/opt/mia/workspace/clientes/sweet_angels/sdr_medio_porte/field_map.json"

# Field map correto com todos os 27 IDs
FIELD_MAP = {
    "ID":                   "aVwCFO90Of3jjHIhV95k",
    "Empresa":              "lpjLWd8bncXzJKjcbStJ",
    "Razão social":         "8IEhp5FGbcpFN3iq5tOl",
    "CNPJ":                 "OXuuJ2qaOS3Rft8yYYbM",
    "Segmento":             "cSL5V3alae1Lfwp1lDgy",
    "Cidade":               "XVTqTBgDCkPt18kjfdvR",
    "UF":                   "oqnUiGIkWoBymIGnnS2q",
    "Faixa de porte":       "6I3jx64pfxsBzw4gaauJ",
    "Porte Receita":        "PlxnATBHchZCw2GCFqdz",
    "Capital social":       "dk3MjINe0AIh0D5KElow",
    "Data de abertura":     "ED2DyQJp09lRJlmwHSyz",
    "Telefone":             "RjZ8ZgbrTK7u6sK0hqK1",
    "Telefone 2":           "wULjWvSGCJnB5RZKvvKB",
    "E-mail":               "HNonQeaoS8eUB99m2Hdn",
    "Site":                 "HTynXy6CmQBknlpaGxBH",
    "Evidência":            "SPKGluCYV8KOjLDfwibw",
    "Sinal de investimento":"XWpHFVfuzyI64KDzUIbH",
    "Prioridade":           "rBMdYasInQNmNNa7T02f",
    "Decisor sugerido":     "EdC4SLeAYvoSPSXbrXcj",
    "Fonte empresarial":    "aXZYNAlB7EtoGuhxfrWZ",
    "Fonte cadastral":      "FNZuXl5FDLEGD572pZxf",
    "Data da validação":    "1UM9Qqf6A7UNbLNBjQwF",
    "Status CRM":           "euuI72rYh9tZSwNz6sGf",
    "Responsável":          "Lb3RMtbOWvJnpXR6d5NW",
    "Próxima ação":         "sfLdwuQXtPkLxjVYM6TR",
    "Data próxima ação":    "9OiHBIfqMdAuesHEO7AG",
    "Observações":          "vjlnJxtWw8t7JQuyiU19",
}


def serialize_value(val):
    if val is None:
        return None
    if isinstance(val, (datetime, date)):
        if hasattr(val, 'strftime'):
            return val.strftime("%Y-%m-%d")
    if isinstance(val, float):
        if val == int(val):
            return str(int(val))
        return str(val)
    if isinstance(val, int):
        return str(val)
    return str(val).strip() or None


def load_leads():
    wb = openpyxl.load_workbook(XLSX)
    ws = wb["Leads_Região"]
    headers = [cell.value for cell in ws[1]]
    leads = {}
    for row in ws.iter_rows(min_row=2, values_only=True):
        if not any(row):
            continue
        d = dict(zip(headers, row))
        empresa = (d.get("Empresa") or "").strip()
        if empresa:
            leads[empresa] = d
    return leads


def load_result():
    with open(RESULT_PATH) as f:
        return json.load(f)


def update_contact(contact_id, custom_fields):
    r = requests.put(
        f"{BASE}/contacts/{contact_id}",
        headers=HEADERS,
        json={"customFields": custom_fields}
    )
    _ = r.text  # consume body
    try:
        return r.status_code, r.json()
    except Exception:
        return r.status_code, {}


def main():
    print("=== PATCH: Custom Fields nos contatos ===")
    result = load_result()
    leads_db = load_leads()
    sucessos = result.get("sucessos", [])

    ok_count  = 0
    err_count = 0

    for i, s in enumerate(sucessos, 1):
        contact_id = s.get("contact_id")
        empresa    = s.get("empresa", "")

        if not contact_id:
            continue

        lead = leads_db.get(empresa)
        if not lead:
            # tenta match parcial
            lead = next((v for k, v in leads_db.items() if empresa in k or k in empresa), None)

        if not lead:
            print(f"  [{i}] {empresa}: lead não encontrado na planilha, pulando")
            err_count += 1
            continue

        custom_fields = []
        for col, fid in FIELD_MAP.items():
            raw_val = lead.get(col)
            val = serialize_value(raw_val)
            if val is not None:
                custom_fields.append({"id": fid, "value": val})

        if not custom_fields:
            continue

        status, resp = update_contact(contact_id, custom_fields)
        if status in (200, 201):
            ok_count += 1
            if i <= 5 or i % 50 == 0:
                print(f"  [{i}/{len(sucessos)}] {empresa} -> OK ({len(custom_fields)} fields)")
        else:
            err_count += 1
            print(f"  [{i}/{len(sucessos)}] {empresa} -> ERRO {status}: {str(resp)[:150]}")

        time.sleep(0.2)

    print(f"\nPatch concluído: {ok_count} atualizados | {err_count} erros")

    # Spot-check no primeiro contato
    if sucessos:
        first = sucessos[0]
        cid = first.get("contact_id")
        print(f"\n=== Spot-check: {first['empresa']} ({cid}) ===")
        r = requests.get(f"{BASE}/contacts/{cid}", headers=HEADERS)
        _ = r.text
        if r.status_code == 200:
            data = r.json()
            contact = data.get("contact", data)
            cfs = contact.get("customFields", [])
            print(f"  Custom fields no contato: {len(cfs)}")
            for cf in cfs:
                print(f"    id={cf.get('id')} | value={str(cf.get('value', ''))[:60]}")
            print(f"  Tags: {contact.get('tags', [])}")
        else:
            print(f"  Erro ao buscar: {r.status_code}")


if __name__ == "__main__":
    main()
