#!/usr/bin/env python3
"""
Script one-shot: cria os 24 campos custom sdr__ na location Climb (Linkia).

Idempotente: se o campo ja existe, nao recria — pega o ID existente.
Salva o mapa {field_key: id} em custom_fields.json na pasta do projeto.

Uso:
    python3 setup_custom_fields.py
"""

from __future__ import annotations

import json
import logging
import os
import sys
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(BASE_DIR))

# Load env
try:
    from dotenv import load_dotenv
    load_dotenv(BASE_DIR / "torq_bruno.env")
except ImportError:
    for line in (BASE_DIR / "torq_bruno.env").read_text().splitlines():
        line = line.strip()
        if not line or line.startswith("#") or "=" not in line:
            continue
        k, v = line.split("=", 1)
        os.environ.setdefault(k.strip(), v.strip())

from ghl_client import list_custom_fields, create_custom_field  # noqa: E402

logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
log = logging.getLogger("setup")

TOKEN = os.environ["LINKIA_TOKEN"]
LOCATION_ID = os.environ["LINKIA_LOCATION_ID"]

# ---------------------------------------------------------------------------
# Definicao dos 24 campos custom (bloco 7 do dossie ALMA)
# ---------------------------------------------------------------------------
# Formato: (field_key, name, data_type, picklist_options)
FIELDS: list[tuple[str, str, str, list[str] | None]] = [
    ("sdr__nome_lead", "SDR — Nome do Lead", "TEXT", None),
    ("sdr__canal_origem", "SDR — Canal de Origem", "SINGLE_OPTIONS",
        ["whatsapp_direto", "dm_instagram", "meta_ads", "site", "indicacao", "outro"]),
    ("sdr__perfil", "SDR — Perfil", "SINGLE_OPTIONS",
        ["b2c_urbano", "b2c_entusiasta", "b2c_aposentado", "b2c_lifestyle",
         "b2b_revenda", "b2b_frota", "b2b_empresa_interna", "b2b_marketplace"]),
    ("sdr__cidade", "SDR — Cidade", "TEXT", None),
    ("sdr__uf", "SDR — UF", "SINGLE_OPTIONS",
        ["MG", "SP", "RJ", "ES", "GO", "DF", "BA", "PR", "SC", "RS",
         "PE", "CE", "AM", "PA", "outra"]),
    ("sdr__regiao_logistica", "SDR — Regiao Logistica", "SINGLE_OPTIONS",
        ["bh_rmbh", "interior_mg", "sp_rj_es", "nordeste", "sul",
         "centro_oeste", "norte"]),
    ("sdr__modelo_interesse_principal", "SDR — Modelo Principal",
        "SINGLE_OPTIONS",
        ["whale", "jaguar", "a5", "318", "c3", "c2", "load", "long",
         "vintage", "indefinido"]),
    ("sdr__modelo_interesse_secundario", "SDR — Modelo Secundario",
        "SINGLE_OPTIONS",
        ["whale", "jaguar", "a5", "318", "c3", "c2", "load", "long",
         "vintage", "nenhum"]),
    ("sdr__categoria_interesse", "SDR — Categoria", "SINGLE_OPTIONS",
        ["bike", "scooter", "triciclo_carga", "lifestyle", "indefinido"]),
    ("sdr__uso_pretendido", "SDR — Uso Pretendido", "SINGLE_OPTIONS",
        ["dia_a_dia_urbano", "trabalho_entrega", "passeio_lazer",
         "frota_delivery", "logistica_interna", "revenda", "indefinido"]),
    ("sdr__tem_cnh", "SDR — Tem CNH", "SINGLE_OPTIONS",
        ["sim_A", "sim_ACC", "nao", "nao_perguntado", "nao_aplica"]),
    ("sdr__budget_declarado", "SDR — Budget Declarado (R$)", "NUMERICAL", None),
    ("sdr__forma_pagamento_preferida", "SDR — Forma de Pagamento",
        "SINGLE_OPTIONS",
        ["pix_a_vista", "cartao_parcelado", "boleto_parcelado",
         "financiamento_torq", "consorcio", "a_definir"]),
    ("sdr__prazo_compra", "SDR — Prazo Compra", "SINGLE_OPTIONS",
        ["imediato_7d", "ate_30d", "30_60d", "60_90d", "indefinido"]),
    ("sdr__conheceu_por", "SDR — Como Conheceu", "TEXT", None),
    ("sdr__objecao_principal", "SDR — Objecao Principal", "SINGLE_OPTIONS",
        ["preco", "qualidade_chines", "marca_desconhecida", "cnh",
         "autonomia", "assistencia", "financiamento", "prazo_entrega",
         "esposa_socio", "nenhuma"]),
    ("sdr__aceita_visita", "SDR — Aceita Visita", "SINGLE_OPTIONS",
        ["sim_bh", "sim_contagem", "sim_betim", "nao_regiao",
         "nao_prefere_online"]),
    ("sdr__cnpj", "SDR — CNPJ (B2B)", "TEXT", None),
    ("sdr__volume_estimado_b2b", "SDR — Volume Estimado (un)", "NUMERICAL", None),
    ("sdr__classificacao_lead", "SDR — Classificacao Lead", "SINGLE_OPTIONS",
        ["quente", "morno", "frio", "perdido"]),
    ("sdr__status_pipeline", "SDR — Status Pipeline", "SINGLE_OPTIONS",
        ["novo", "respondeu", "qualificando", "qualificado",
         "visita_agendada", "proposta_enviada", "com_closer",
         "ganhamos", "perdemos"]),
    ("sdr__resumo_conversa", "SDR — Resumo da Conversa", "LARGE_TEXT", None),
    ("sdr__proximo_passo", "SDR — Proximo Passo", "TEXT", None),
    ("sdr__horario_preferido_retorno", "SDR — Horario Preferido de Retorno",
        "TEXT", None),
]


def main() -> int:
    log.info("listando campos existentes...")
    existing = list_custom_fields(LOCATION_ID, TOKEN)
    # existing eh lista de {id, name, fieldKey, ...}
    # fieldKey vem geralmente prefixado com "contact." — normaliza
    existing_by_key: dict[str, str] = {}
    for f in existing:
        key = f.get("fieldKey", "")
        # remove prefixo contact. se existir
        if key.startswith("contact."):
            key = key[len("contact."):]
        existing_by_key[key] = f["id"]

    log.info("%d campos ja existem na location", len(existing_by_key))

    field_map: dict[str, str] = {}
    created = 0
    skipped = 0
    failed = 0

    for field_key, name, data_type, options in FIELDS:
        if field_key in existing_by_key:
            field_map[field_key] = existing_by_key[field_key]
            skipped += 1
            log.info("[skip] %s -> %s", field_key, existing_by_key[field_key])
            continue

        log.info("[create] %s (%s)", field_key, data_type)
        result = create_custom_field(
            location_id=LOCATION_ID,
            name=name,
            field_key=field_key,
            data_type=data_type,
            token=TOKEN,
            picklist_options=options,
        )
        if result and result.get("id"):
            field_map[field_key] = result["id"]
            created += 1
            log.info("  ok id=%s", result["id"])
        else:
            failed += 1
            log.warning("  falha")

    out_path = BASE_DIR / "custom_fields.json"
    out_path.write_text(json.dumps(field_map, indent=2, ensure_ascii=False),
                        encoding="utf-8")

    log.info("=" * 60)
    log.info("SETUP CUSTOM FIELDS COMPLETO")
    log.info("  criados: %d | ja existentes: %d | falhas: %d",
             created, skipped, failed)
    log.info("  mapa salvo em: %s", out_path)
    return 0 if failed == 0 else 1


if __name__ == "__main__":
    sys.exit(main())
