import json
from pathlib import Path
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, KeepTogether, HRFlowable
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfgen import canvas

# Carrega os dados
json_path = Path("/home/magdalena/eee/alunos/victor-lei/caso_de_uso_dados.json")
dados = json.loads(json_path.read_text(encoding="utf-8"))

pdf_path = "/home/magdalena/eee/alunos/victor-lei/Caso_de_Uso_Victor_Lei.pdf"

class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_page_elements(num_pages)
            super().showPage()
        super().save()

    def draw_page_elements(self, page_count):
        self.saveState()
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#718096"))
        
        # Cabeçalho (a partir da página 2)
        if self._pageNumber > 1:
            self.drawString(54, 750, "BRANA PROJETOS NAVAIS — CASO DE USO & REQUISITOS DE PROJETO")
            self.drawRightString(612 - 54, 750, f"PROJETISTA: {dados.get('projetista', '').upper()}")
            self.setStrokeColor(colors.HexColor("#E2E8F0"))
            self.setLineWidth(0.5)
            self.line(54, 742, 612 - 54, 742)
        
        # Rodapé
        self.setStrokeColor(colors.HexColor("#CBD5E0"))
        self.setLineWidth(0.5)
        self.line(54, 45, 612 - 54, 45)
        self.drawString(54, 32, "Brana · Escola de Arquitetura e Engenharia Naval | Estaleiro Escola Embrião (EEE)")
        self.drawRightString(612 - 54, 32, f"Página {self._pageNumber} de {page_count}")
        self.restoreState()

doc = SimpleDocTemplate(
    pdf_path,
    pagesize=letter,
    leftMargin=54,
    rightMargin=54,
    topMargin=54,
    bottomMargin=54
)

styles = getSampleStyleSheet()

# Estilos personalizados
cor_primaria = colors.HexColor("#1A365D")   # Azul Marinho Brana
cor_secundaria = colors.HexColor("#2B6CB0") # Azul Médio
cor_fundo_tabela = colors.HexColor("#F7FAFC")
cor_borda = colors.HexColor("#E2E8F0")

style_titulo = ParagraphStyle(
    'DocTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=22,
    leading=26,
    textColor=cor_primaria,
    spaceAfter=4
)

style_subtitulo = ParagraphStyle(
    'DocSubTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=12,
    leading=15,
    textColor=cor_secundaria,
    spaceAfter=15
)

style_instrucoes = ParagraphStyle(
    'Instrucoes',
    parent=styles['Normal'],
    fontName='Helvetica-Oblique',
    fontSize=9,
    leading=13,
    textColor=colors.HexColor("#4A5568")
)

style_secao_titulo = ParagraphStyle(
    'SectionHeading',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=12,
    leading=15,
    textColor=colors.white,
    spaceBefore=0,
    spaceAfter=0
)

style_campo_label = ParagraphStyle(
    'FieldLabel',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=8.5,
    leading=11,
    textColor=cor_primaria
)

style_campo_val = ParagraphStyle(
    'FieldValue',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=8.5,
    leading=11.5,
    textColor=colors.HexColor("#2D3748")
)

SECOES = [
    ("1. Missão", [
        ("Uso principal da embarcação", "uso_principal"),
        ("Papel mais importante que o barco precisa cumprir", "papel_principal"),
    ]),
    ("2. Perfil do Usuário", [
        ("Usuário principal", "usuario_principal"),
        ("O usuário principal é também o proprietário?", "usuario_e_dono"),
        ("Quem irá pilotar a embarcação", "quem_pilota"),
        ("Pernoite (haverá? para quantas pessoas?)", "pernoite"),
        ("O que mais gosta durante o caminho", "gosta_caminho"),
        ("O que mais gosta enquanto parado", "gosta_parado"),
        ("Outros desejos do usuário ou capitão", "outros_desejos"),
        ("Usuários em potencial", "usuarios_potenciais"),
        ("Tipo de grupo", "tipo_grupo"),
        ("Número médio de tripulantes", "tripulantes_medio"),
        ("Número máximo de tripulantes (dia)", "tripulantes_max_dia"),
        ("Número máximo de tripulantes (pernoite)", "tripulantes_max_pernoite"),
        ("Local de residência do usuário principal", "residencia"),
        ("Tipo de casa", "tipo_casa"),
        ("Média anual de dias utilizando a embarcação", "dias_ano"),
        ("Média anual (dias) de uso contínuo", "dias_continuos"),
    ]),
    ("3. Área de Navegação", [
        ("Região", "regiao"),
        ("Derrota habitual (ponto inicial, final, distância)", "derrota"),
        ("Pontes e eclusas no trajeto", "pontes_eclusas"),
        ("Clima", "clima"),
        ("Vento / ondas", "vento_ondas"),
        ("Regime de chuvas", "chuvas"),
        ("Variação de maré", "mare"),
        ("Restrição de calado (calado máximo)", "restricao_calado"),
        ("Outras informações relevantes / restrições", "restricoes_gerais"),
        ("Operação — tempo", "tempo_operacao"),
        ("Travessias (distância máxima)", "travessia_max"),
    ]),
    ("4. Orçamento", [
        ("Orçamento total para construção/aquisição", "orcamento_total"),
        ("Capacidade de desembolso mensal", "desembolso_mensal"),
        ("Orçamento anual para manutenção/melhorias", "orcamento_manutencao"),
        ("Mantido por", "mantido_por"),
    ]),
    ("5. Construtor", [
        ("Construtor / Estaleiro", "construtor"),
        ("Tipo de construtor", "tipo_construtor"),
        ("Experiência do construtor/estaleiro", "experiencia_construtor"),
        ("Material de construção", "material"),
        ("Método de construção", "metodo_construcao"),
        ("Faixa de tamanho em que tem experiência", "faixa_tamanho_experiencia"),
        ("Tipo de embarcação em que tem experiência", "tipo_embarcacao_experiencia"),
    ]),
    ("6. Outros Requisitos", [
        ("Propulsão principal", "propulsao"),
        ("Motorização", "motorizacao"),
        ("Armação (apenas veleiros)", "armacao"),
        ("Requisitos de performance", "performance"),
    ]),
    ("7. Dimensões Principais (Proposta & Confirmação)", [
        ("Comprimento (LOA)", "loa"),
        ("Boca (BOA)", "boca"),
        ("Pontal", "pontal"),
        ("Calado", "calado"),
        ("Justificativa das dimensões", "justificativa_dimensoes"),
    ]),
]

story = []

# Cabeçalho Principal
story.append(Paragraph("CASO DE USO DE EMBARCAÇÃO", style_titulo))
story.append(Paragraph(f"Projeto: Lancha Clássica 16 Pés &nbsp;|&nbsp; Projetista: <b>{dados.get('projetista', 'N/A')}</b> &nbsp;|&nbsp; Data: {dados.get('data', 'N/A')}", style_subtitulo))

# Caixa de Instruções
instrucao_texto = (
    "<b>Instruções:</b> Uma embarcação é uma solução de compromisso entre requisitos conflitantes. "
    "Este documento formaliza as demandas de missão, usuário, área de navegação, métodos construtivos e "
    "proposta dimensional, servindo como a bússola mandatória para todas as decisões de engenharia e arquitetura naval."
)
t_inst = Table([[Paragraph(instrucao_texto, style_instrucoes)]], colWidths=[504])
t_inst.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#EDF2F7")),
    ('BOX', (0,0), (-1,-1), 1, colors.HexColor("#CBD5E0")),
    ('TOPPADDING', (0,0), (-1,-1), 7),
    ('BOTTOMPADDING', (0,0), (-1,-1), 7),
    ('LEFTPADDING', (0,0), (-1,-1), 10),
    ('RIGHTPADDING', (0,0), (-1,-1), 10),
]))
story.append(t_inst)
story.append(Spacer(1, 12))

# Renderiza cada seção como tabela estruturada
for titulo_sec, campos in SECOES:
    elementos_secao = []
    
    # Barra de Título da Seção
    t_sec_header = Table([[Paragraph(titulo_sec.upper(), style_secao_titulo)]], colWidths=[504])
    t_sec_header.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), cor_primaria),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 8),
    ]))
    elementos_secao.append(t_sec_header)
    
    # Tabela com os campos
    linhas_tabela = []
    for rotulo, chave in campos:
        val = dados.get(chave, "N/A")
        val_str = str(val).strip() if val not in (None, "") else "N/A"
        linhas_tabela.append([
            Paragraph(rotulo, style_campo_label),
            Paragraph(val_str, style_campo_val)
        ])
    
    t_campos = Table(linhas_tabela, colWidths=[170, 334])
    t_campos.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.white),
        ('GRID', (0,0), (-1,-1), 0.5, cor_borda),
        ('VALIGN', (0,0), (-1,-1), 'TOP'),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 6),
        ('RIGHTPADDING', (0,0), (-1,-1), 6),
        ('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.white, cor_fundo_tabela])
    ]))
    elementos_secao.append(t_campos)
    elementos_secao.append(Spacer(1, 10))
    
    story.append(KeepTogether(elementos_secao))

doc.build(story, canvasmaker=NumberedCanvas)
print("PDF gerado com sucesso em:", pdf_path)
