#!/usr/bin/env python3
"""
Receita Imperatriz: TRAVESSIA — 26 portas A-Z em grid 6x5.

Cada porta = card premium com numero+letra+nome.
Cor por pilar (9 pilares = 9 cores agrupadas).
Frame externo "TRAVESSIA IMPERATRIZ — METODOLOGIA TATA GONCALVES".
Annotations Virgil + titulo Helvetica grande.

Uso:
    python3 receitas/travessia.py --saida ~/travessia.excalidraw [--obsidian]
"""

import argparse
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,
    envelopa_em_frame,
    salvar,
    texto,
)
from helpers.paleta import (  # noqa: E402
    FONT_CASCADIA,
    FONT_HELVETICA,
    FONT_VIRGIL,
    TAMANHOS,
    cor_sombra,
    get_paleta,
)


# 26 portas da Travessia com pilar e nome
PORTAS = [
    # (letra, nome curto, pilar)
    ("A", "Sinal",            "I. Despertar"),
    ("B", "Decisao",          "I. Despertar"),
    ("C", "Eixo",             "II. Diagnostico"),
    ("D", "7 Pilares",        "II. Diagnostico"),
    ("E", "Mecanismo",        "II. Diagnostico"),
    ("F", "Rotina",           "III. Construcao"),
    ("G", "Voz",              "III. Construcao"),
    ("H", "Linha editorial",  "III. Construcao"),
    ("I", "Persona",          "IV. 1a Venda"),
    ("J", "Oferta",           "IV. 1a Venda"),
    ("K", "Funil",            "IV. 1a Venda"),
    ("L", "Calendario",       "V. Repetir"),
    ("M", "Conteudo",         "V. Repetir"),
    ("N", "Anuncios",         "V. Repetir"),
    ("O", "Time",             "VI. Escalar"),
    ("P", "Sistemas",         "VI. Escalar"),
    ("Q", "Marca",            "VII. Reger"),
    ("R", "Legado",           "VII. Reger"),
    ("S", "Sucessao",         "VII. Reger"),
    ("T", "Tese",             "VIII. Autoridade"),
    ("U", "Universidade",     "VIII. Autoridade"),
    ("V", "Voz publica",      "VIII. Autoridade"),
    ("W", "Wealth",           "IX. Patrimonio"),
    ("X", "X (incognita)",    "IX. Patrimonio"),
    ("Y", "Yield (juros)",    "IX. Patrimonio"),
    ("Z", "Zenite",           "IX. Patrimonio"),
]


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

    # Titulo grande premium
    elementos.append(texto(
        160, 60, "TRAVESSIA", paleta,
        tamanho=72, fonte=FONT_HELVETICA,
        cor=paleta["dominante"],
    ))
    elementos.append(texto(
        160, 140, "IMPERATRIZ", paleta,
        tamanho=56, fonte=FONT_HELVETICA,
        cor=paleta["accent"],
    ))
    elementos.append(texto(
        160, 210, "metodologia Tata Goncalves — 26 portas, 9 pilares", paleta,
        tamanho=18, fonte=FONT_VIRGIL,
        cor=paleta["neutro_medio"],
    ))

    # Mapeia pilar -> cor (9 pilares = 9 cores em gradiente Imperatriz)
    pilares_unicos = []
    for _, _, pilar in PORTAS:
        if pilar not in pilares_unicos:
            pilares_unicos.append(pilar)

    cores_pilares = {}
    for i, pilar in enumerate(pilares_unicos):
        # Alterna entre dominante (esmeralda) e accent (dourado) com opacidades
        if i % 3 == 0:
            cor = cor_sombra(paleta["dominante"], 30)
        elif i % 3 == 1:
            cor = cor_sombra(paleta["accent"], 30)
        else:
            cor = cor_sombra(paleta["destaque_quente"], 25)
        cores_pilares[pilar] = cor

    # Grid 6 cols x 5 lin (cabe 30, usa 26 + 4 vazios pra legenda)
    cols = 6
    largura_card = 200
    altura_card = 140
    gap_x = 40
    gap_y = 40
    x_inicio = 160
    y_inicio = 320

    for idx, (letra, nome, pilar) in enumerate(PORTAS):
        col = idx % cols
        lin = idx // cols
        x = x_inicio + col * (largura_card + gap_x)
        y = y_inicio + lin * (altura_card + gap_y)

        # Card da porta
        card_els = card_premium(
            x, y, largura_card, altura_card, paleta,
            "",  # texto bound vazio, vamos adicionar manualmente
            fill=cores_pilares[pilar],
            sombra=True,
        )
        # Remove o texto bound padrao (vamos colocar 3 textos: letra grande, numero, nome)
        elementos.extend([e for e in card_els if e.get("type") != "text"])

        shape_card = next(e for e in card_els if e.get("type") == "rectangle"
                          and e.get("backgroundColor") != cor_sombra(paleta["traco"], 15))

        # Numero da porta no canto superior esquerdo (Cascadia mono)
        elementos.append(texto(
            x + 14, y + 12, f"{idx+1:02d}", paleta,
            tamanho=14, fonte=FONT_CASCADIA,
            cor=paleta["neutro_medio"],
        ))

        # Letra grande centralizada
        elementos.append(texto(
            x + largura_card / 2 - 22, y + 32, letra, paleta,
            tamanho=64, fonte=FONT_HELVETICA,
            cor=paleta["dominante"],
            alinhamento="center", largura=44,
        ))

        # Nome da porta embaixo
        elementos.append(texto(
            x + 16, y + 108, nome, paleta,
            tamanho=14, fonte=FONT_HELVETICA,
            cor=paleta["traco"],
            alinhamento="center", largura=largura_card - 32,
        ))

    # Legenda dos pilares na area vazia (4 espacos sobrando)
    y_legenda = y_inicio + 5 * (altura_card + gap_y) - 20
    elementos.append(texto(
        x_inicio, y_legenda, "PILARES", paleta,
        tamanho=14, fonte=FONT_HELVETICA,
        cor=paleta["neutro_medio"],
    ))
    for i, pilar in enumerate(pilares_unicos):
        col = i % 3
        lin = i // 3
        lx = x_inicio + col * 400
        ly = y_legenda + 28 + lin * 24
        # Quadradinho de cor
        bolinha = card_premium(lx, ly, 16, 16, paleta, "", fill=cores_pilares[pilar], sombra=False)
        elementos.extend([e for e in bolinha if e.get("type") != "text"])
        elementos.append(texto(
            lx + 24, ly + 2, pilar, paleta,
            tamanho=12, fonte=FONT_HELVETICA,
            cor=paleta["traco"],
        ))

    # Annotation Virgil
    elementos.append(texto(
        x_inicio, y_legenda + 140,
        "← cada porta e um marco. atravesse uma de cada vez.", paleta,
        tamanho=16, fonte=FONT_VIRGIL,
        cor=paleta["accent"],
    ))

    # Envelopa tudo em Frame nomeado
    elementos = envelopa_em_frame(
        elementos,
        "TRAVESSIA IMPERATRIZ — METODOLOGIA TATA GONCALVES",
        paleta,
    )

    return elementos


def main():
    parser = argparse.ArgumentParser(description="Gera receita Travessia 26 portas")
    parser.add_argument("--saida", required=True)
    parser.add_argument("--paleta", default="imperatriz")
    parser.add_argument("--obsidian", action="store_true")
    args = parser.parse_args()

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

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

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


if __name__ == "__main__":
    main()
