#!/usr/bin/env python3
"""
Receita Imperatriz: METODO OLIMPO — 12 deuses + 3C (Configure/Conecte/Comande).

Hub central "OLIMPO" em dourado sobre carvao + 12 cards de deuses em circulo
+ anel decorativo externo com os 3C + sombra falsa + annotations Virgil.
Paleta dark_premium recomendada (background carvao + neon dourado).

Uso:
    python3 receitas/olimpo.py --saida ~/olimpo.excalidraw [--paleta dark_premium]
"""

import argparse
import math
import sys
from pathlib import Path

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

from helpers.excalidraw import (  # noqa: E402
    card_premium,
    cena_excalidraw,
    cena_obsidian_md,
    conector_inteligente,
    elipse,
    envelopa_em_frame,
    salvar,
    texto,
)
from helpers.paleta import (  # noqa: E402
    FONT_CASCADIA,
    FONT_HELVETICA,
    FONT_VIRGIL,
    TAMANHOS,
    cor_sombra,
    get_paleta,
)


# 12 deuses + funcao no metodo Olimpo
DEUSES = [
    ("Zeus",      "orquestracao",     "agente-mor"),
    ("Hera",      "fidelizacao",      "retencao"),
    ("Atena",     "estrategia",       "C-level"),
    ("Apolo",     "autoridade",       "conteudo"),
    ("Artemis",   "precisao",         "metricas"),
    ("Ares",      "execucao",         "operacao"),
    ("Hermes",    "comunicacao",      "ads/copy"),
    ("Hefesto",   "produto",          "fabrica"),
    ("Afrodite",  "atracao",          "branding"),
    ("Dionisio",  "experiencia",      "evento"),
    ("Demeter",   "nutricao",         "sucesso"),
    ("Poseidon",  "escala",           "infra"),
]

# 3C — anel externo decorativo
TRES_C = ["CONFIGURE", "CONECTE", "COMANDE"]


def construir(paleta):
    """Constroi os elementos da receita Olimpo."""
    elementos = []

    # Titulo grande premium
    elementos.append(texto(
        160, 60, "METODO OLIMPO", paleta,
        tamanho=72, fonte=FONT_HELVETICA,
        cor=paleta["accent"],
    ))
    elementos.append(texto(
        160, 140, "12 deuses orquestrando seu negocio", paleta,
        tamanho=20, fonte=FONT_VIRGIL,
        cor=paleta["dominante"],
    ))

    # Hub central
    cx, cy = 900, 720
    raio_centro = 140

    centro_el = elipse(
        cx - raio_centro, cy - raio_centro,
        raio_centro * 2, raio_centro * 2, paleta,
        fill=paleta["dominante"],
    )
    centro_el["strokeColor"] = paleta["accent"]
    centro_el["strokeWidth"] = 4
    elementos.append(centro_el)

    # Texto centro
    txt_centro = texto(
        cx - raio_centro, cy - 24, "OLIMPO", paleta,
        tamanho=36, fonte=FONT_HELVETICA,
        alinhamento="center", vertical="middle",
        cor=paleta["accent"], container_id=centro_el["id"],
        largura=raio_centro * 2,
    )
    txt_centro["x"] = cx - raio_centro
    txt_centro["y"] = cy - raio_centro
    txt_centro["width"] = raio_centro * 2
    txt_centro["height"] = raio_centro * 2
    centro_el["boundElements"] = [{"type": "text", "id": txt_centro["id"]}]
    elementos.append(txt_centro)

    # Anel externo (decorativo, tracejado, mais largo)
    raio_orbita_3c = 540
    anel_3c = elipse(
        cx - raio_orbita_3c, cy - raio_orbita_3c,
        raio_orbita_3c * 2, raio_orbita_3c * 2, paleta,
    )
    anel_3c["strokeStyle"] = "dashed"
    anel_3c["strokeColor"] = paleta["accent"]
    anel_3c["strokeWidth"] = 2
    anel_3c["backgroundColor"] = "transparent"
    elementos.append(anel_3c)

    # 3C posicionados em 3 pontos do anel (topo, esquerda-baixo, direita-baixo)
    angulos_3c = [-math.pi / 2, math.pi - math.pi / 6, math.pi / 6]
    for label, ang in zip(TRES_C, angulos_3c):
        lx = cx + math.cos(ang) * raio_orbita_3c - 80
        ly = cy + math.sin(ang) * raio_orbita_3c - 14
        elementos.append(texto(
            int(lx), int(ly), label, paleta,
            tamanho=20, fonte=FONT_HELVETICA,
            cor=paleta["accent"],
            alinhamento="center", largura=160,
        ))

    # 12 deuses em circulo (orbita interna)
    raio_orbita = 380
    raio_card_w = 200
    raio_card_h = 90

    for i, (nome, funcao, papel) in enumerate(DEUSES):
        ang = (2 * math.pi * i / len(DEUSES)) - math.pi / 2
        px = cx + math.cos(ang) * raio_orbita - raio_card_w / 2
        py = cy + math.sin(ang) * raio_orbita - raio_card_h / 2

        # Card do deus
        card_els = card_premium(
            int(px), int(py), raio_card_w, raio_card_h, paleta,
            "",  # vamos colocar 3 textos manualmente
            fill=paleta["background"], sombra=True,
        )
        elementos.extend([e for e in card_els if e.get("type") != "text"])
        card_principal = next(e for e in card_els if e.get("type") == "rectangle"
                              and e.get("backgroundColor") == paleta["background"])

        # Nome do deus (Helvetica grande)
        elementos.append(texto(
            int(px) + 16, int(py) + 12, nome.upper(), paleta,
            tamanho=18, fonte=FONT_HELVETICA,
            cor=paleta["dominante"],
        ))

        # Funcao (Virgil — annotation)
        elementos.append(texto(
            int(px) + 16, int(py) + 40, funcao, paleta,
            tamanho=14, fonte=FONT_VIRGIL,
            cor=paleta["accent"],
        ))

        # Papel tecnico (Cascadia mono)
        elementos.append(texto(
            int(px) + 16, int(py) + 62, papel, paleta,
            tamanho=11, fonte=FONT_CASCADIA,
            cor=paleta["neutro_medio"],
        ))

        # Conector elbow do centro pra cada deus
        elementos.extend(conector_inteligente(
            centro_el, card_principal, paleta, elbow=True,
        ))

    # Annotation Virgil principal
    elementos.append(texto(
        160, 1350,
        "→ cada deus e um agente. agente e funcionario digital com 4 lados.", paleta,
        tamanho=16, fonte=FONT_VIRGIL,
        cor=paleta["accent"],
    ))
    elementos.append(texto(
        160, 1380,
        "→ leia mais em: mentoriaimperioia.com/glossariodatata", paleta,
        tamanho=14, fonte=FONT_VIRGIL,
        cor=paleta["neutro_medio"],
    ))

    # Envelopa em frame
    elementos = envelopa_em_frame(
        elementos,
        "METODO OLIMPO — IMPERATRIZ TATA GONCALVES",
        paleta,
    )

    return elementos


def main():
    parser = argparse.ArgumentParser(description="Gera receita Metodo Olimpo")
    parser.add_argument("--saida", required=True)
    parser.add_argument("--paleta", default="dark_premium")
    parser.add_argument("--obsidian", action="store_true")
    args = parser.parse_args()

    paleta = get_paleta(args.paleta)
    modo_dark = args.paleta == "dark_premium"
    elementos = construir(paleta)
    cena = cena_excalidraw(elementos, paleta, modo_dark=modo_dark)

    p = salvar(cena, args.saida)
    print(f"✓ Olimpo salvo: {p} ({len(elementos)} elementos)")

    if args.obsidian:
        md = cena_obsidian_md(elementos, paleta, modo_dark=modo_dark, titulo="Metodo Olimpo")
        p_md = str(p).replace(".excalidraw", ".excalidraw.md")
        salvar(md, p_md, formato="md")
        print(f"✓ Obsidian: {p_md}")


if __name__ == "__main__":
    main()
