import os
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, Image, PageBreak, KeepTogether
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from PIL import Image as PILImage

def redimensionar_imagem(caminho, max_w, max_h):
    if not os.path.exists(caminho):
        return None
    try:
        with PILImage.open(caminho) as img:
            w, h = img.size
            ratio = min(max_w / w, max_h / h)
            return Image(caminho, width=w*ratio, height=h*ratio)
    except Exception as e:
        return None

def gerar_lista_verificacao_com_imagens_grupo2(pdf_path):
    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=A4,
        leftMargin=1.2*cm,
        rightMargin=1.2*cm,
        topMargin=1.2*cm,
        bottomMargin=1.2*cm
    )
    
    styles = getSampleStyleSheet()
    azul_brana = colors.HexColor('#002B49')
    azul_claro = colors.HexColor('#EBF3F8')
    cinza_fundo = colors.HexColor('#F4F6F8')
    cinza_borda = colors.HexColor('#D1D5DB')
    texto_escuro = colors.HexColor('#1F2937')
    vermelho = colors.HexColor('#9A3231')
    verde = colors.HexColor('#166534')
    
    title_style = ParagraphStyle(
        'DocTitle', parent=styles['Heading1'],
        fontName='Helvetica-Bold', fontSize=12.5, leading=15.5,
        textColor=azul_brana, spaceAfter=2, alignment=1
    )
    sub_style = ParagraphStyle(
        'DocSub', parent=styles['Normal'],
        fontName='Helvetica', fontSize=7.5, leading=10,
        textColor=colors.HexColor('#4B5563'), alignment=1
    )
    aviso_style = ParagraphStyle(
        'Aviso', parent=styles['Normal'],
        fontName='Helvetica-Oblique', fontSize=6, leading=8,
        textColor=colors.HexColor('#6B7280'), alignment=1
    )
    h2_style = ParagraphStyle(
        'DocH2', parent=styles['Heading2'],
        fontName='Helvetica-Bold', fontSize=10, leading=13,
        textColor=azul_brana, spaceBefore=6, spaceAfter=3
    )
    table_hdr = ParagraphStyle(
        'TableHdr', parent=styles['Normal'],
        fontName='Helvetica-Bold', fontSize=6.5, leading=8,
        textColor=colors.white, alignment=1
    )
    table_cell = ParagraphStyle(
        'TableCell', parent=styles['Normal'],
        fontName='Helvetica', fontSize=6.2, leading=7.8,
        textColor=texto_escuro
    )
    table_cell_c = ParagraphStyle(
        'TableCellC', parent=styles['Normal'],
        fontName='Helvetica', fontSize=6.2, leading=7.8,
        textColor=texto_escuro, alignment=1
    )
    table_cell_b = ParagraphStyle(
        'TableCellB', parent=styles['Normal'],
        fontName='Helvetica-Bold', fontSize=6.2, leading=7.8,
        textColor=azul_brana
    )
    table_cell_status = ParagraphStyle(
        'TableCellStatus', parent=styles['Normal'],
        fontName='Helvetica-Bold', fontSize=6.2, leading=7.8,
        textColor=verde, alignment=1
    )
    caption_style = ParagraphStyle(
        'ImgCaption', parent=styles['Normal'],
        fontName='Helvetica-Bold', fontSize=7, leading=9,
        textColor=azul_brana, alignment=1
    )

    story = []
    
    base_dir = '/home/magdalena/eee/alunos/carlos-silva/grupo-2-tesouro-da-baia'
    
    # ------------------ PÁGINA 1: TABELA OFICIAL DA LISTA DE VERIFICAÇÃO ------------------
    story.append(Paragraph("O conteúdo deste material é de uso exclusivo dos alunos matriculados nos cursos do Brana. Este não pode ser reproduzido, copiado, vendido ou transferido. A reprodução total ou parcial de qualquer conteúdo é expressamente proibida e constitui crime de violação de Direito Autoral.", aviso_style))
    story.append(Spacer(1, 0.15*cm))
    story.append(Paragraph("LISTA DE VERIFICAÇÃO — PASTA DE ENTREGA DE DOCUMENTOS DO PROJETO FINAL", title_style))
    story.append(Paragraph("<b>GRUPO 2:</b> Carlos Silva, Cauã e Alessandra Feitosa | <b>EMBARCAÇÃO:</b> Saveiro Tradicional 'Tesouro da Baía' (12,00 m)", sub_style))
    story.append(Paragraph("<b>INSTITUIÇÃO:</b> Estaleiro Escola Embrião (EEE) & Brana Projetos Navais | <b>DATA:</b> 15/10/2026", sub_style))
    story.append(Spacer(1, 0.1*cm))
    story.append(HRFlowable(width="100%", thickness=1.2, color=azul_brana, spaceBefore=1, spaceAfter=4))
    
    headers = [
        Paragraph("<b>DOCUMENTO</b>", table_hdr),
        Paragraph("<b>O QUE É?</b>", table_hdr),
        Paragraph("<b>FORMATO</b>", table_hdr),
        Paragraph("<b>ARQUIVO DO GRUPO 2 / DADOS DO PROJETO</b>", table_hdr),
        Paragraph("<b>STATUS</b>", table_hdr)
    ]
    t_data = [headers]
    
    linhas = [
        ("Caso de Uso", 
         "Documento formal descrevendo a missão operacional, rotas na BTS, perfil dos 12 passageiros e requisitos.", 
         "Digital / DOCX", 
         "Caso_de_Uso_Saveiro_Tesouro_da_Baia.docx (e consolidado no Projeto_Naval_Integral.pdf)", 
         "PRONTO"),
        ("Tabela Similares e Dimensões Principais", 
         "Tabela comparativa preenchida no padrão Brana com os 6 similares (Day Use, É a Vida, IP 38, Shannon, Dhow, Rabelo).", 
         "Papel / PDF", 
         "estudo_similares_grupo_2.pdf / Tabela_Similares_Pesos_Centros_Grupo2.pdf", 
         "PRONTO"),
        ("Plano de Linhas do Projeto do Grupo", 
         "Prancha técnica oficial A3 com as 3 vistas (Perfil, Topo e Balizas) gerada a partir da Tabela V4.", 
         "Papel / PDF", 
         "Plano-de-Linhas-Tesouro-da-Baia-Alessandra-Feitosa.pdf (Escala A3)", 
         "PRONTO"),
        ("Similar 1 - Arranjo Geral", 
         "Layout de convés e planta baixa do Saveiro Day Use (12,0 m).", 
         "Papel / Img", 
         "croqui_12m_350m_190m.jpg (Arranjo com tijupá e porão central)", 
         "PRONTO"),
        ("Similar 1 - Perfil", 
         "Vista lateral / perfil do Saveiro Day Use na BTS.", 
         "Papel / Img", 
         "croqui_12m_350m_190m.jpg (Perfil de tosado, quilha corrida e cadaste)", 
         "PRONTO"),
        ("Similar 2 - Arranjo Geral", 
         "Planta baixa do Saveiro tradicional 'É a Vida' (12,2 m - Valença).", 
         "Papel / Img", 
         "croqui_cotado_12m_380m.jpg (Arranjo de mastreação e praça de carga)", 
         "PRONTO"),
        ("Similar 2 - Perfil", 
         "Perfil longitudinal do Saveiro 'É a Vida'.", 
         "Papel / Img", 
         "FOTO DO RASCUNHO.jpg (Perfil de linhas de água e cavername)", 
         "PRONTO"),
        ("Similar 3 - Arranjo Geral", 
         "Layout de convés do Island Packet 38 / Dhow tradicional.", 
         "Papel / PDF", 
         "preview_similares-1.png (Plantas baixas dos similares catalogados)", 
         "PRONTO"),
        ("Similar 3 - Perfil", 
         "Vista lateral do Island Packet 38 / Shannon 38.", 
         "Papel / PDF", 
         "tabela_estudo_similares_original.jpg (Fichas e perfis de referência)", 
         "PRONTO"),
        ("Arranjo Geral do Projeto do Grupo", 
         "Esboço cotado e planta do Tesouro da Baía (12,0 m x 4,36 m): tijupá de popa, praça de carga e carlinga do mastro.", 
         "Papel / JPG", 
         "croqui_papel_milimetrado_tesouro_da_baia.jpg (Rascunho oficial em escala)", 
         "PRONTO"),
        ("Relatório de Predição de Velocidade", 
         "Painel interativo e memória de cálculo de velocidade pelos métodos de Dave Gerr e John Teale.", 
         "Digital / HTML", 
         "Estimativa-Velocidade-Caua.html (Cruzeiro 6,8 nós / Máx 7,7 nós com 40 HP)", 
         "PRONTO"),
        ("Condição Pesos e Centros - Leve", 
         "Quadro de pesos da estrutura nua (chapa 25/28 mm, 30 cavernas, quilha corrida): Lightship = 3.881 kg.", 
         "Papel / PDF", 
         "Memoria_Calculo_Pesos_Arranjo_Estrutural_Tesouro_da_Baia.pdf", 
         "PRONTO"),
        ("Condição Pesos e Centros - Carregado", 
         "Quadro de carga plena (14.500 kg): lastro de 550 kg (z=0,08 m), motor 40 HP, tanques e carga útil.", 
         "Papel / PDF", 
         "Exercicio_Pesos_e_Centros_CG_Grupo2.pdf (LCG=5,31 m | VCG=1,18 m | Trim 0°)", 
         "PRONTO"),
        ("Relatório Estruturas", 
         "Memória de cálculo de escantilhões e painel interativo pelo ABS Guide (1994) e regra de Dave Gerr.", 
         "Digital / HTML", 
         "Arranjo-Estrutural-Redondo-Caua.html (Fundo 25 mm, FS=2,77 | Costado 28 mm, FS=2,95)", 
         "PRONTO"),
        ("Relatório Balanço Vélico", 
         "Painel interativo de plano vélico: vela de pena de 95 m², mastro de 14,5 m, lead de 11,2% e Dellenbaugh 14,8°.", 
         "Digital / HTML", 
         "Plano Velico - Caua.html (Estabilidade até 180° e rig tradicional da Bahia)", 
         "PRONTO"),
        ("Apresentação Final do Projeto", 
         "Dossiê / Memorial Técnico completo reunindo missão, linhas, hidrostática, pesos, estrutura e rigging.", 
         "Digital / PDF", 
         "Projeto_Naval_Integral_Tesouro_da_Baia_Grupo_2.pdf (Memorial Consolidado)", 
         "PRONTO")
    ]
    
    for doc_nome, oque, fmt, arq, status in linhas:
        t_data.append([
            Paragraph(f"<b>{doc_nome}</b>", table_cell_b),
            Paragraph(oque, table_cell),
            Paragraph(fmt, table_cell_c),
            Paragraph(arq, table_cell),
            Paragraph(status, table_cell_status)
        ])
        
    col_widths = [3.8*cm, 4.4*cm, 1.8*cm, 6.8*cm, 1.4*cm]
    t = Table(t_data, colWidths=col_widths)
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), azul_brana),
        ('GRID', (0,0), (-1,-1), 0.5, cinza_borda),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, cinza_fundo]),
        ('TOPPADDING', (0,0), (-1,-1), 1.6),
        ('BOTTOMPADDING', (0,0), (-1,-1), 1.6),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('BACKGROUND', (4,1), (4,-1), colors.HexColor('#DCFCE7')),
    ]))
    story.append(t)
    story.append(Spacer(1, 0.15*cm))
    story.append(HRFlowable(width="100%", thickness=0.8, color=cinza_borda, spaceBefore=2, spaceAfter=4))
    story.append(Paragraph("<i>Lista de Verificação Oficial preenchida para o Grupo 2 — Curso de Design Profissional de Embarcações (Brana / Estaleiro Escola Embrião).</i>", ParagraphStyle('RodFinal', parent=sub_style, fontSize=6.5, textColor=colors.HexColor('#6B7280'), alignment=1)))
    
    story.append(PageBreak())
    
    # ------------------ PÁGINA 2: ANEXO VISUAL DE COMPROVAÇÃO DE ENTREGAS ------------------
    story.append(Paragraph("ANEXO VISUAL: COMPROVAÇÃO DOS CROQUIS, SIMILARES E ARRANJOS DO GRUPO 2", h2_style))
    story.append(Paragraph("Imagens e rascunhos em escala anexados à pasta de entrega do projeto do saveiro <i>Tesouro da Baía</i>:", sub_style))
    story.append(Spacer(1, 0.2*cm))
    
    # Carregar imagens
    img1 = redimensionar_imagem(os.path.join(base_dir, "tabela_estudo_similares_original.jpg"), 8.5*cm, 6.2*cm)
    img2 = redimensionar_imagem(os.path.join(base_dir, "preview_similares-1.png"), 8.5*cm, 6.2*cm)
    img3 = redimensionar_imagem(os.path.join(base_dir, "croqui_papel_milimetrado_tesouro_da_baia.jpg"), 8.5*cm, 6.2*cm)
    img4 = redimensionar_imagem(os.path.join(base_dir, "croqui_cotado_12m_380m.jpg"), 8.5*cm, 6.2*cm)
    img5 = redimensionar_imagem(os.path.join(base_dir, "croqui_12m_350m_190m.jpg"), 8.5*cm, 6.2*cm)
    img6 = redimensionar_imagem(os.path.join(base_dir, "FOTO DO RASCUNHO.jpg"), 8.5*cm, 6.2*cm)
    
    cell1 = [Paragraph("<b>Tabela Original de Similares do Grupo 2</b>", caption_style), Spacer(1, 1), img1] if img1 else Paragraph("Img 1 não encontrada", table_cell)
    cell2 = [Paragraph("<b>Plantas dos Similares Catalogados</b>", caption_style), Spacer(1, 1), img2] if img2 else Paragraph("Img 2 não encontrada", table_cell)
    cell3 = [Paragraph("<b>Arranjo Geral e Linhas em Papel Milimetrado (Oficial)</b>", caption_style), Spacer(1, 1), img3] if img3 else Paragraph("Img 3 não encontrada", table_cell)
    cell4 = [Paragraph("<b>Similar 2: Saveiro 'É a Vida' (12,2m × 3,80m)</b>", caption_style), Spacer(1, 1), img4] if img4 else Paragraph("Img 4 não encontrada", table_cell)
    cell5 = [Paragraph("<b>Similar 1: Perfil e Cavername (12,0m × 3,50m)</b>", caption_style), Spacer(1, 1), img5] if img5 else Paragraph("Img 5 não encontrada", table_cell)
    cell6 = [Paragraph("<b>Rascunho de Linhas e Flutuação (Saveiro É a Vida)</b>", caption_style), Spacer(1, 1), img6] if img6 else Paragraph("Img 6 não encontrada", table_cell)
    
    t_grid_data = [
        [cell1, cell2],
        [cell3, cell4],
        [cell5, cell6]
    ]
    
    t_grid = Table(t_grid_data, colWidths=[9.0*cm, 9.0*cm])
    t_grid.setStyle(TableStyle([
        ('ALIGN', (0,0), (-1,-1), 'CENTER'),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, cinza_borda),
        ('BACKGROUND', (0,0), (-1,-1), colors.white),
        ('TOPPADDING', (0,0), (-1,-1), 3),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
    ]))
    story.append(t_grid)
    story.append(Spacer(1, 0.2*cm))
    story.append(HRFlowable(width="100%", thickness=0.8, color=cinza_borda, spaceBefore=2, spaceAfter=4))
    story.append(Paragraph("<i>Anexo fotográfico e iconográfico oficial do Grupo 2 — Tesouro da Baía (Brana / EEE).</i>", ParagraphStyle('RodFinal2', parent=sub_style, fontSize=6.5, textColor=colors.HexColor('#6B7280'), alignment=1)))
    
    doc.build(story)

if __name__ == '__main__':
    gerar_lista_verificacao_com_imagens_grupo2('/home/magdalena/eee/alunos/carlos-silva/grupo-2-tesouro-da-baia/Lista_Verificacao_Entregas_Grupo2.pdf')
