#!/usr/bin/env python3
"""Cria campanha + 3 adsets + creatives + ads (todos PAUSED)."""
import sys, json, time
sys.path.insert(0, "/opt/mia/workspace/clientes/borrello")
from _meta_api import (API, ACT, TOKEN, PAGE_ID, IG_ID, PIXEL_ID,
                       post, get, load_ids, save_ids)

ids = load_ids()
V = ids["videos"]  # label -> video_id

CHECKOUT = "https://go.hotmart.com/J14755507D?src=ads07.26"
UTM = ("utm_source=meta&utm_medium=cpc&utm_campaign=mesas-radionicas-07.26"
       "&utm_content={{ad.name}}&utm_term={{adset.name}}")

# Audiences
AUD_ALUNOS_MESAS = "120249797804440103"      # exclusao
AUD_LAL_MESAS    = "120249797805040103"
AUD_BASE_COMPLETA= "120249797803450103"
AUD_LAL_BORRELLO = "120249797804230103"
AUD_IG_SEG       = "120216178557610103"
AUD_VIEW50_MESAS = "120210900874830024"
AUD_COMPRADORES_RAD = "120249797003050103"   # exclusao extra ad set C

# Copy (3 variacoes de copy_ads_radionicas.md)
COPY = {
"dor": {
"headline": "Quebre o ciclo dos problemas que sempre voltam",
"primary": ("Voce ja fez de tudo para mudar sua vida... mas os mesmos problemas continuam voltando.\n\n"
"Nao e falta de esforco nem de fe. E que a maioria das solucoes trata o sintoma e ignora a raiz energetica do problema.\n\n"
"O Prof. Francisco Borrello pesquisou isso por 35 anos e formou mais de 40.000 alunos. Ele desenvolveu um metodo com 5 Mesas Radionicas Quanticas fisicas, enviadas para a sua casa, que trabalham saude, prosperidade, relacionamentos e protecao ao mesmo tempo.\n\n"
"Voce aprende a usa-las do zero, com 9 estagios ao vivo por ano e acesso direto ao WhatsApp do professor.\n\n"
"Garantia de 7 dias. Sem risco.\n\nClique em Saiba Mais e veja todos os detalhes."),
"description": "Metodo com 35 anos de pesquisa e 40.000 alunos formados",
},
"transformacao": {
"headline": "Torne-se terapeuta com uma ferramenta que 99% nao conhece",
"primary": ("E se voce pudesse cobrar por sessoes de terapia energetica usando uma ferramenta que a maioria dos terapeutas nao conhece?\n\n"
"O que diferencia quem lidera o mercado holistico e o metodo. E metodo e o que o Prof. Francisco Borrello ensina ha 35 anos.\n\n"
"No curso Mesas Radionicas Quanticas voce aprende a trabalhar com 5 mesas fisicas enviadas para a sua casa, domina a Radiestesia e sai habilitada para atender clientes em saude, prosperidade, relacionamentos e protecao.\n\n"
"40.000 alunos formados. Estagios ao vivo 9x por ano. Suporte direto com o professor. Tudo por R$897 a vista ou 12x de R$92,77.\n\n"
"Garantia de 7 dias. Acesse agora e veja o que esta incluso."),
"description": "5 mesas fisicas em casa + Radiestesia + suporte do professor",
},
"familia": {
"headline": "Proteja e fortaleca a energia de toda a sua familia",
"primary": ("Quando alguem da sua familia sofre, voce sente que devia estar fazendo mais. E se voce pudesse?\n\n"
"Filho com comportamento dificil. Parceiro emocionalmente fechado. Familiar com saude fragil. Essa sensacao de impotencia e uma das mais pesadas que existem.\n\n"
"As Mesas Radionicas Quanticas trabalham a distancia. Voce nao precisa que a pessoa esteja presente nem que ela acredite. O campo energetico responde.\n\n"
"Com o curso do Prof. Francisco Borrello (35 anos de pesquisa, 40.000 alunos formados) voce recebe 5 mesas fisicas em casa e aprende a proteger, equilibrar e fortalecer saude, relacionamentos e prosperidade de toda a familia.\n\n"
"9 estagios ao vivo por ano e suporte direto com o professor. Por R$897 ou 12x de R$92,77.\n\n"
"Garantia de 7 dias. Veja tudo que esta incluso e comece hoje."),
"description": "As mesas trabalham a distancia, para toda a familia",
},
}


def get_thumb(video_id):
    d = get(f"{video_id}/thumbnails")
    for t in d.get("data", []):
        if t.get("is_preferred"):
            return t["uri"]
    return d["data"][0]["uri"]


def wait_video_ready(video_id, label):
    for _ in range(30):
        st = get(video_id, {"fields": "status"}).get("status", {})
        if st.get("video_status") == "ready":
            return True
        print(f"    aguardando {label} processar... ({st.get('video_status')})", flush=True)
        time.sleep(10)
    return False


def make_creative(name, video_label, copy_key):
    video_id = V[video_label]
    wait_video_ready(video_id, video_label)
    thumb = get_thumb(video_id)
    c = COPY[copy_key]
    story_spec = {
        "page_id": PAGE_ID,
        "instagram_user_id": IG_ID,
        "video_data": {
            "video_id": video_id,
            "image_url": thumb,
            "message": c["primary"],
            "title": c["headline"],
            "link_description": c["description"],
            "call_to_action": {
                "type": "LEARN_MORE",
                "value": {"link": CHECKOUT},
            },
        },
    }
    res = post(f"{ACT}/adcreatives", {
        "name": name,
        "object_story_spec": json.dumps(story_spec),
        "degrees_of_freedom_spec": json.dumps(
            {"creative_features_spec": {"standard_enhancements": {"enroll_status": "OPT_OUT"}}}),
    })
    return res["id"]


# ---------- 1. CAMPANHA ----------
if not ids.get("campaign"):
    print("Criando campanha...", flush=True)
    res = post(f"{ACT}/campaigns", {
        "name": "MESAS RADIONICAS [VENDA] 07.2026",
        "objective": "OUTCOME_SALES",
        "status": "PAUSED",
        "special_ad_categories": json.dumps([]),
        "buying_type": "AUCTION",
        "is_adset_budget_sharing_enabled": "false",
    })
    ids["campaign"] = res["id"]
    save_ids(ids)
    print(f"  CAMPANHA -> {ids['campaign']}", flush=True)
else:
    print(f"SKIP campanha -> {ids['campaign']}")

CAMP = ids["campaign"]


# ---------- 2. AD SETS ----------
def make_adset(key, name, budget_cents, targeting):
    if ids["adsets"].get(key):
        print(f"SKIP adset {key} -> {ids['adsets'][key]}")
        return ids["adsets"][key]
    print(f"Criando adset {name}...", flush=True)
    res = post(f"{ACT}/adsets", {
        "name": name,
        "campaign_id": CAMP,
        "status": "PAUSED",
        "daily_budget": str(budget_cents),
        "billing_event": "IMPRESSIONS",
        "optimization_goal": "OFFSITE_CONVERSIONS",
        "bid_strategy": "LOWEST_COST_WITHOUT_CAP",
        "promoted_object": json.dumps({
            "pixel_id": PIXEL_ID,
            "custom_event_type": "PURCHASE",
        }),
        "attribution_spec": json.dumps([
            {"event_type": "CLICK_THROUGH", "window_days": 7},
            {"event_type": "VIEW_THROUGH", "window_days": 1},
        ]),
        "targeting": json.dumps(targeting),
    })
    ids["adsets"][key] = res["id"]
    save_ids(ids)
    print(f"  ADSET {key} -> {res['id']}", flush=True)
    return res["id"]


geo = {"geo_locations": {"countries": ["BR"]}}

# A - FRIO
tgt_A = dict(geo)
tgt_A.update({
    "age_min": 30, "age_max": 65,
    "custom_audiences": [{"id": AUD_LAL_MESAS}, {"id": AUD_LAL_BORRELLO}],
    "excluded_custom_audiences": [{"id": AUD_ALUNOS_MESAS}],
    "targeting_automation": {"advantage_audience": 0},
})
adset_A = make_adset("A_frio", "[FRIO] LAL Mesas + LAL Borrello", 3000, tgt_A)

# B - QUENTE
tgt_B = dict(geo)
tgt_B.update({
    "age_min": 25, "age_max": 65,
    "custom_audiences": [{"id": AUD_IG_SEG}, {"id": AUD_VIEW50_MESAS}],
    "excluded_custom_audiences": [{"id": AUD_ALUNOS_MESAS}],
    "targeting_automation": {"advantage_audience": 0},
})
adset_B = make_adset("B_quente", "[QUENTE] Seguidores IG + View Video 50%", 3000, tgt_B)

# C - CROSS-SELL
tgt_C = dict(geo)
tgt_C.update({
    "age_min": 25, "age_max": 65,
    "custom_audiences": [{"id": AUD_BASE_COMPLETA}],
    "excluded_custom_audiences": [{"id": AUD_ALUNOS_MESAS}, {"id": AUD_COMPRADORES_RAD}],
    "targeting_automation": {"advantage_audience": 0},
})
adset_C = make_adset("C_crosssell", "[CROSS-SELL] Alunos Borrello Base Completa", 3000, tgt_C)


# ---------- 3. CREATIVES + ADS ----------
# (adset_key, ad_name, video_label, copy_key)
ADS = [
    ("A_frio", "MESAS 1 [FRIO] familia",        "MESAS 1", "familia"),
    ("A_frio", "MESAS 2 [FRIO] dor",            "MESAS 2", "dor"),
    ("A_frio", "MESAS 3 [FRIO] transformacao",  "MESAS 3", "transformacao"),
    ("B_quente", "MESAS 4 [QUENTE] dor",        "MESAS 4", "dor"),
    ("B_quente", "MESAS 5 [QUENTE] familia",    "MESAS 5", "familia"),
    ("C_crosssell", "MESAS 1 [CROSS] transformacao", "MESAS 1", "transformacao"),
    ("C_crosssell", "MESAS 4 [CROSS] familia",  "MESAS 4", "familia"),
]

for adset_key, ad_name, vlabel, ckey in ADS:
    ad_key = f"{adset_key}::{ad_name}"
    if ids["ads"].get(ad_key):
        print(f"SKIP ad {ad_name} -> {ids['ads'][ad_key]}")
        continue
    # creative
    cr_key = ad_key
    if not ids["creatives"].get(cr_key):
        print(f"Criando creative {ad_name} ({vlabel}/{ckey})...", flush=True)
        cid = make_creative(f"CR {ad_name}", vlabel, ckey)
        ids["creatives"][cr_key] = cid
        save_ids(ids)
        print(f"  CREATIVE -> {cid}", flush=True)
    cid = ids["creatives"][cr_key]
    # ad
    print(f"Criando ad {ad_name}...", flush=True)
    res = post(f"{ACT}/ads", {
        "name": ad_name,
        "adset_id": ids["adsets"][adset_key],
        "creative": json.dumps({"creative_id": cid}),
        "status": "PAUSED",
        "tracking_specs": json.dumps([{"action.type": ["offsite_conversion"], "fb_pixel": [PIXEL_ID]}]),
        "url_tags": UTM,
    })
    ids["ads"][ad_key] = res["id"]
    save_ids(ids)
    print(f"  AD {ad_name} -> {res['id']}", flush=True)

print("\n=== ESTRUTURA COMPLETA ===")
print(json.dumps(ids, ensure_ascii=False, indent=2))
