import json
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable
from reportlab.pdfgen import canvas

with open("/home/magdalena/eee/alunos/caliandra/caso_de_uso_dados.json", "r") as f:
    d = json.load(f)

pdf_path = "/home/magdalena/eee/alunos/caliandra/Caso_de_Uso_Caliandra.pdf"
proj_nome = d.get("projetista", "Caliandra")
proj_data = d.get("data", "15/09/2026")

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_number(num_pages)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

    def draw_page_number(self, page_count):
        self.saveState()
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#5A626B"))
        # Header
        self.drawString(54, 750, "BRANA · Escola de Arquitetura e Engenharia Naval | Estaleiro Escola Embrião")
        self.drawRightString(612 - 54, 750, "Caso de Uso — Projeto O RESGATE")
        self.setStrokeColor(colors.HexColor("#D3D9DC"))
        self.setLineWidth(0.5)
        self.line(54, 742, 612 - 54, 742)
        
        # Footer
        self.line(54, 45, 612 - 54, 45)
        self.drawString(54, 32, f"Projetista: {proj_nome} · Data: {proj_data}")
        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=60,
    bottomMargin=60
)

styles = getSampleStyleSheet()

title_style = ParagraphStyle(
    "DocTitle",
    parent=styles["Normal"],
    fontName="Helvetica-Bold",
    fontSize=18,
    leading=22,
    textColor=colors.HexColor("#1F2429"),
    spaceAfter=4
)

subtitle_style = ParagraphStyle(
    "DocSubtitle",
    parent=styles["Normal"],
    fontName="Helvetica",
    fontSize=10,
    leading=14,
    textColor=colors.HexColor("#5A626B"),
    spaceAfter=12
)

intro_style = ParagraphStyle(
    "IntroBox",
    parent=styles["Normal"],
    fontName="Helvetica-Oblique",
    fontSize=8.5,
    leading=12,
    textColor=colors.HexColor("#2E6B72")
)

sec_title_style = ParagraphStyle(
    "SecTitle",
    parent=styles["Normal"],
    fontName="Helvetica-Bold",
    fontSize=11,
    leading=15,
    textColor=colors.HexColor("#C4262E"),
    spaceBefore=8,
    spaceAfter=3
)

q_style = ParagraphStyle(
    "Question",
    parent=styles["Normal"],
    fontName="Helvetica-Bold",
    fontSize=8.5,
    leading=11.5,
    textColor=colors.HexColor("#1F2429")
)

a_style = ParagraphStyle(
    "Answer",
    parent=styles["Normal"],
    fontName="Helvetica",
    fontSize=8,
    leading=11,
    textColor=colors.HexColor("#333333")
)

story = []

# Title & Header
story.append(Paragraph("Caso de Uso — Formulário de Requisitos", title_style))
story.append(Paragraph(f"Embarcação: <b>O RESGATE</b> (Lancha SAR / Apoio Offshore 9m — 12 Pessoas) | Projetista: <b>{proj_nome}</b>", subtitle_style))

# Intro box
intro_text = (
    "<b>Instruções:</b> Uma embarcação é uma solução de compromisso entre requisitos conflitantes; "
    "este questionário nos ajuda a priorizar estas demandas. Lembre que um barco precisa de uma missão, "
    "tarefa ou propósito a ser cumprido — este é nosso norte nas escolhas de projeto."
)
intro_table = Table([[Paragraph(intro_text, intro_style)]], colWidths=[504])
intro_table.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#EFF2F3")),
    ("PADDING", (0, 0), (-1, -1), 6),
    ("BOX", (0, 0), (-1, -1), 0.5, colors.HexColor("#D3D9DC")),
    ("ROUNDEDCORNERS", [4, 4, 4, 4])
]))
story.append(intro_table)
story.append(Spacer(1, 6))

sections = [
    ("1. Missão", [
        ("Qual o uso principal da embarcação?", d.get("uso_principal", "N/A")),
        ("Qual o papel mais importante este barco precisa cumprir?", d.get("papel_principal", "N/A"))
    ]),
    ("2. Perfil do Usuário e Operação", [
        ("Usuário principal (faixa etária, qualificações, equipe)", d.get("usuario_principal", "N/A")),
        ("O usuário principal é também o proprietário?", d.get("usuario_e_dono", "N/A")),
        ("O que mais gosta com relação a navegar — durante o caminho", d.get("gosta_caminho", "N/A")),
        ("O que mais gosta — enquanto parado / na área de operação", d.get("gosta_parado", "N/A")),
        ("Outros desejos e requisitos operacionais", d.get("outros_desejos", "N/A")),
        ("Quem irá pilotar a embarcação?", d.get("quem_pilota", "N/A")),
        ("Haverá pernoite? Para quantas pessoas?", d.get("pernoite", "N/A")),
        ("Usuários em potencial / público atendido", d.get("usuarios_potenciais", "N/A")),
        ("Tipo de grupo / tripulação", d.get("tipo_grupo", "N/A")),
        ("Número médio de tripulantes a bordo", d.get("tripulantes_medio", "N/A")),
        ("Número máximo de pessoas a bordo (dia / operação)", d.get("tripulantes_max_dia", "N/A")),
        ("Número máximo de pessoas (pernoite)", d.get("tripulantes_max_pernoite", "N/A")),
        ("Local da base operacional / residência", d.get("residencia", "N/A")),
        ("Tipo de instalação / atracadouro", d.get("tipo_casa", "N/A")),
        ("Média anual de dias utilizando a embarcação", d.get("dias_ano", "N/A")),
        ("Média anual de dias em uso contínuo por missão", d.get("dias_continuos", "N/A"))
    ]),
    ("3. Área de Navegação e Condições Ambientais", [
        ("Região de operação", d.get("regiao", "N/A")),
        ("Derrota habitual (ponto inicial, final, distância padrão)", d.get("derrota", "N/A")),
        ("Pontes e eclusas no trajeto", d.get("pontes_eclusas", "N/A")),
        ("Clima e regime de temperaturas", d.get("clima", "N/A")),
        ("Regime de vento e ondas", d.get("vento_ondas", "N/A")),
        ("Regime de chuvas", d.get("chuvas", "N/A")),
        ("Variação de maré", d.get("mare", "N/A")),
        ("Restrição de calado na rota", d.get("restricao_calado", "N/A")),
        ("Restrições gerais e tráfego marítimo", d.get("restricoes_gerais", "N/A")),
        ("Condições operacionais de tempo / mar", d.get("tempo_operacao", "N/A")),
        ("Travessia máxima / Raio de ação", d.get("travessia_max", "N/A"))
    ]),
    ("4. Orçamento e Planejamento Financeiro", [
        ("Orçamento total para construção e equipagem", d.get("orcamento_total", "N/A")),
        ("Capacidade de desembolso mensal durante a obra", d.get("desembolso_mensal", "N/A")),
        ("Orçamento anual para manutenção e revisões", d.get("orcamento_manutencao", "N/A")),
        ("Responsável pela manutenção", d.get("mantido_por", "N/A"))
    ]),
    ("5. Construtor, Material e Método Construtivo", [
        ("Construtor / Estaleiro", d.get("construtor", "N/A")),
        ("Tipo de construtor", d.get("tipo_construtor", "N/A")),
        ("Experiência do construtor / estaleiro", d.get("experiencia_construtor", "N/A")),
        ("Material de construção (casco e cabine)", d.get("material", "N/A")),
        ("Método de fabricação e montagem", d.get("metodo_construcao", "N/A")),
        ("Faixa de tamanho em que o estaleiro tem experiência", d.get("faixa_tamanho_experiencia", "N/A")),
        ("Tipo de embarcação em que tem experiência", d.get("tipo_embarcacao_experiencia", "N/A"))
    ]),
    ("6. Propulsão e Requisitos de Performance", [
        ("Propulsão principal", d.get("propulsao", "N/A")),
        ("Motorização (arranjo, tipo, potência e combustível)", d.get("motorizacao", "N/A")),
        ("Armação vélica", d.get("armacao", "N/A")),
        ("Requisitos de performance e autonomia", d.get("performance", "N/A"))
    ]),
    ("7. Dimensões Principais de Projeto", [
        ("Comprimento Total (LOA)", d.get("loa", "N/A")),
        ("Boca Máxima (BOA)", d.get("boca", "N/A")),
        ("Pontal (D)", d.get("pontal", "N/A")),
        ("Calado de Projeto (T)", d.get("calado", "N/A")),
        ("Justificativa técnica das dimensões adotadas", d.get("justificativa_dimensoes", "N/A"))
    ])
]

for sec_title, qas in sections:
    story.append(Paragraph(sec_title, sec_title_style))
    story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C4262E"), spaceAfter=4, spaceBefore=0))
    
    table_data = []
    for q, a in qas:
        p_q = Paragraph(f"• <b>{q}</b>", q_style)
        p_a = Paragraph(a, a_style)
        table_data.append([p_q])
        table_data.append([p_a])
    
    t = Table(table_data, colWidths=[504])
    t.setStyle(TableStyle([
        ("VALIGN", (0, 0), (-1, -1), "TOP"),
        ("LEFTPADDING", (0, 0), (-1, -1), 4),
        ("RIGHTPADDING", (0, 0), (-1, -1), 4),
        ("TOPPADDING", (0, 0), (-1, -1), 1),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 2),
    ]))
    story.append(t)
    story.append(Spacer(1, 3))

doc.build(story, canvasmaker=NumberedCanvas)
print("PDF do Caso de Uso atualizado!")
