#!/usr/bin/env python3
"""
Gera um dashboard HTML standalone da Matriz RFV a partir do <saida>_resumo.json
produzido por calcular_rfv.py. Design system Painel da Tata (creme + navy +
purpura, Montserrat + Cormorant). Abre direto no navegador, nao precisa servidor.

Uso:
  python3 gerar_dashboard.py rfv_resumo.json --saida dashboard-rfv.html --titulo "RFV - Base Junho"

Renderiza:
  - KPIs (total de clientes, receita, nº de segmentos ativos)
  - Grade visual Recencia x Frequencia (canto sup-dir = Campeoes)
  - Tabela de segmentos ordenada por receita, com barra de % e acao sugerida

Usa apenas a biblioteca padrao (json, argparse). Nao importa XML.
"""
import argparse
import json
import sys

# Cor + celula (linha=recencia alta->baixa, coluna=freq baixa->alta) + acao curta.
SEG_META = {
    "Campeoes":            {"cor": "#6B4E9E", "emoji": "\U0001F451", "acao": "VIP, acesso antecipado, peca indicacao e depoimento"},
    "Clientes Fieis":      {"cor": "#3E5C8A", "emoji": "\U0001F49C", "acao": "Upsell, programa de fidelidade, cross-sell"},
    "Fieis em Potencial":  {"cor": "#4A7BA6", "emoji": "\U0001F331", "acao": "Onboarding + oferta pra virar recorrente"},
    "Novos Clientes":      {"cor": "#5B9BD5", "emoji": "\U00002728", "acao": "Boas-vindas, nutricao, segunda oferta"},
    "Promissores":         {"cor": "#7FB3D5", "emoji": "\U0001F600", "acao": "Engajar com conteudo, construir confianca"},
    "Precisam de Atencao": {"cor": "#C9A227", "emoji": "\U000026A0",  "acao": "Reativar com oferta limitada"},
    "Prestes a Dormir":    {"cor": "#D4A55A", "emoji": "\U0001F4A4", "acao": "Reengajar antes de perder"},
    "Em Risco":            {"cor": "#C1573C", "emoji": "\U0001F6A8", "acao": "URGENTE: win-back personalizado, ligar"},
    "Nao Posso Perde-los": {"cor": "#A32E2E", "emoji": "\U0001F198", "acao": "Resgate agressivo, oferta irresistivel"},
    "Hibernando":          {"cor": "#8C8C8C", "emoji": "\U0001F4A4", "acao": "Ultima tentativa barata; depois deixar ir"},
    "Perdidos":            {"cor": "#5C5C5C", "emoji": "\U0001FAA6", "acao": "Nao gastar verba; reativacao automatica so"},
}

# Posicao na grade 2x2 (Recencia vertical x Frequencia horizontal).
GRID = [
    ["Novos Clientes / Promissores", "Fieis em Potencial / Campeoes"],
    ["Perdidos / Hibernando", "Em Risco / Nao Posso Perde-los"],
]


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("resumo_json")
    ap.add_argument("--saida", default="dashboard-rfv.html")
    ap.add_argument("--titulo", default="Matriz RFV")
    args = ap.parse_args()

    with open(args.resumo_json, encoding="utf-8") as fh:
        data = json.load(fh)

    segs = data.get("segmentos", [])
    if not segs:
        print("Resumo sem segmentos.", file=sys.stderr)
        sys.exit(1)
    max_receita = max((s["receita"] for s in segs), default=1) or 1

    linhas = ""
    for s in segs:
        m = SEG_META.get(s["segmento"], {"cor": "#888", "emoji": "", "acao": ""})
        barra = round(100 * s["receita"] / max_receita, 1)
        linhas += f"""
        <tr>
          <td><span class="dot" style="background:{m['cor']}"></span>{m['emoji']} {s['segmento']}</td>
          <td class="num">{s['clientes']}</td>
          <td class="num">{s['pct_clientes']}%</td>
          <td class="num">R$ {s['receita']:,.2f}</td>
          <td><div class="bar-wrap"><div class="bar" style="width:{barra}%;background:{m['cor']}"></div><span>{s['pct_receita']}%</span></div></td>
          <td class="acao">{m['acao']}</td>
        </tr>"""

    grid_html = ""
    labels = [["Recentes / poucas compras", "Recentes / compram muito"],
              ["Sumiram / baixo valor", "Sumiram / alto valor"]]
    for i, row in enumerate(GRID):
        for j, cell in enumerate(row):
            destaque = "quad-hero" if (i == 0 and j == 1) else ("quad-danger" if (i == 1 and j == 1) else "")
            grid_html += f'<div class="quad {destaque}"><div class="quad-seg">{cell}</div><div class="quad-lbl">{labels[i][j]}</div></div>'

    ticket = f" &middot; ticket {data['ticket']}" if data.get("ticket") else ""
    html = f"""<!DOCTYPE html>
<html lang="pt-BR"><head><meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{args.titulo}</title>
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@500;600;700&family=Montserrat:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
  :root{{--creme:#F5F1E8;--navy:#1E2A3A;--purpura:#6B4E9E;--linha:#E0D8C8;}}
  *{{margin:0;padding:0;box-sizing:border-box}}
  body{{font-family:'Montserrat',sans-serif;background:var(--creme);color:var(--navy);padding:40px 24px;line-height:1.5}}
  .wrap{{max-width:1080px;margin:0 auto}}
  h1{{font-family:'Cormorant Garamond',serif;font-size:2.6rem;font-weight:700;letter-spacing:.5px}}
  .sub{{color:#7A7466;font-size:.9rem;margin:4px 0 32px;font-weight:400}}
  .kpis{{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:36px}}
  .kpi{{background:#fff;border:1px solid var(--linha);border-radius:14px;padding:20px 24px}}
  .kpi .v{{font-family:'Cormorant Garamond',serif;font-size:2rem;font-weight:700;color:var(--purpura)}}
  .kpi .l{{font-size:.72rem;text-transform:uppercase;letter-spacing:1.5px;color:#9A927F;margin-top:4px}}
  h2{{font-family:'Cormorant Garamond',serif;font-size:1.7rem;margin:8px 0 16px;font-weight:600}}
  .grid{{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px}}
  .quad{{background:#fff;border:1px solid var(--linha);border-radius:12px;padding:22px;min-height:110px}}
  .quad-hero{{background:linear-gradient(135deg,#6B4E9E,#3E5C8A);color:#fff;border:none}}
  .quad-danger{{background:linear-gradient(135deg,#C1573C,#A32E2E);color:#fff;border:none}}
  .quad-seg{{font-weight:600;font-size:1rem}}
  .quad-lbl{{font-size:.75rem;opacity:.8;margin-top:6px}}
  .axis{{font-size:.72rem;color:#9A927F;text-transform:uppercase;letter-spacing:1px;margin-bottom:24px}}
  table{{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--linha);border-radius:14px;overflow:hidden}}
  th,td{{padding:12px 14px;text-align:left;border-bottom:1px solid var(--linha);font-size:.86rem}}
  th{{background:var(--navy);color:var(--creme);font-weight:500;text-transform:uppercase;letter-spacing:.8px;font-size:.7rem}}
  tr:last-child td{{border-bottom:none}}
  .num{{text-align:right;font-variant-numeric:tabular-nums}}
  .acao{{color:#5A5445;font-size:.8rem}}
  .dot{{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:8px;vertical-align:middle}}
  .bar-wrap{{position:relative;background:#EFE9DC;border-radius:6px;height:18px;min-width:120px}}
  .bar{{height:100%;border-radius:6px}}
  .bar-wrap span{{position:absolute;right:6px;top:0;font-size:.7rem;line-height:18px;color:var(--navy)}}
  .foot{{margin-top:28px;font-size:.72rem;color:#9A927F;text-align:center}}
</style></head>
<body><div class="wrap">
  <h1>{args.titulo}</h1>
  <div class="sub">Matriz RFV &middot; metodo {data.get('metodo','')}{ticket} &middot; gerado em {data.get('gerado_em','')}</div>
  <div class="kpis">
    <div class="kpi"><div class="v">{data['total_clientes']}</div><div class="l">Clientes na base</div></div>
    <div class="kpi"><div class="v">R$ {data['receita_total']:,.0f}</div><div class="l">Receita total</div></div>
    <div class="kpi"><div class="v">{len(segs)}</div><div class="l">Segmentos ativos</div></div>
  </div>
  <h2>Mapa Recencia &times; Frequencia</h2>
  <div class="grid">{grid_html}</div>
  <div class="axis">Vertical: recencia (recentes em cima) &nbsp;|&nbsp; Horizontal: frequencia (compram mais a direita) &nbsp;|&nbsp; Canto superior direito = Campeoes</div>
  <h2>Segmentos por receita</h2>
  <table>
    <tr><th>Segmento</th><th class="num">Clientes</th><th class="num">% base</th><th class="num">Receita</th><th>% receita</th><th>Acao sugerida</th></tr>
    {linhas}
  </table>
  <div class="foot">Metodo Imperatriz de Segmentacao RFV &middot; propriedade Tata Goncalves</div>
</div></body></html>"""

    with open(args.saida, "w", encoding="utf-8") as fh:
        fh.write(html)
    print(f"OK -> {args.saida}")


if __name__ == "__main__":
    main()
