#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np

from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle, PageBreak, HRFlowable
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm

pasta = "/home/magdalena/eee/alunos/antonio-manoel-costa"
os.makedirs(pasta, exist_ok=True)

# -------------------------------------------------------------
# 1. Gerar Diagrama 1: Arranjo Longitudinal & Cavername (Perfil e Topo)
# -------------------------------------------------------------
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(11, 6), dpi=200, gridspec_kw={'height_ratios': [1.2, 1]})
fig.patch.set_facecolor('#FFFFFF')

# Estilo naval
cor_casco = '#1A2B4C'
cor_caverna = '#C59B27'
cor_antepara = '#C4262E'
cor_quilha = '#8B5A2B'
cor_linha = '#2E5B88'
cor_grid = '#E5E7EB'

# Dados do barco
LOA = 6.30  # m
x = np.linspace(0, LOA, 100)

# Curva de borda (sheer) e quilha no perfil
# x=0 (popa), x=6.3 (proa)
zs = 1.00 - 0.05 * np.sin(np.pi * x / LOA) + 0.18 * (x / LOA)**2
zk = np.maximum(0, 0.25 * (1 - x / 2.5)**2) * (x < 2.5) + (x >= 5.0) * (0.34 * ((x - 5.0)/1.3)**2)
zk[x >= 6.3] = zs[-1]

# Perfil (ax1)
ax1.set_facecolor('#F8FAFC')
ax1.plot(x, zs, color=cor_casco, lw=2.5, label='Borda (Sheer)')
ax1.plot(x, zk, color=cor_quilha, lw=3, label='Quilha / Fundo')
ax1.plot([0, 0.105], [1.00, 0.25], color=cor_casco, lw=2.5) # espelho
ax1.plot([LOA, LOA], [zk[-1], zs[-1]], color=cor_casco, lw=2.5) # roda de proa

# Linha d'água DWL
ax1.axhline(0.32, color='#0284C7', ls='--', lw=1.2, label="Linha d'Água (DWL 32 cm)")

# Cavernas (29 cavernas a cada 0.21 m)
x_cavernas = np.arange(0.21, 6.10, 0.21)
for xc in x_cavernas:
    z_k_c = np.interp(xc, x, zk)
    z_s_c = np.interp(xc, x, zs)
    ax1.plot([xc, xc], [z_k_c, z_s_c], color=cor_caverna, lw=0.8, alpha=0.7)

# Anteparas de colisão (ré: 0.63 m | vante: 5.67 m)
for x_ant, rot in [(0.63, 'Antepara de Ré (0,63 m)'), (5.67, 'Antepara de Vante (5,67 m)')]:
    z_k_a = np.interp(x_ant, x, zk)
    z_s_a = np.interp(x_ant, x, zs)
    ax1.plot([x_ant, x_ant], [z_k_a, z_s_a], color=cor_antepara, lw=2.5)
    ax1.text(x_ant, z_s_a + 0.06, rot, color=cor_antepara, fontsize=7.5, fontweight='bold', ha='center')

# LCG
ax1.scatter([2.65], [0.686], color='#10B981', s=60, zorder=5, marker='o', label='CG Estrutura (LCG=2,65m, VCG=0,69m)')
ax1.axvline(2.65, color='#10B981', ls=':', lw=1)

ax1.set_title('PERFIL ESTRUTURAL LONGITUDINAL — VISTA LATERAL (ESC. 1:25)', fontsize=10, fontweight='bold', color=cor_casco, pad=8)
ax1.set_ylabel('Altura (m)', fontsize=8, color=cor_casco)
ax1.set_xlim(-0.3, 6.6)
ax1.set_ylim(-0.1, 1.4)
ax1.grid(True, color=cor_grid, ls='-', lw=0.5)
ax1.legend(loc='lower center', bbox_to_anchor=(0.5, -0.02), ncol=4, fontsize=7, frameon=True)

# Topo / Planta (ax2)
ax2.set_facecolor('#F8FAFC')
# Meia-boca
ys = 1.225 * np.sin(np.pi * x / LOA)**0.75
# ajuste popa
ys[x < 1.0] = 0.75 + (1.225 * np.sin(np.pi * 1.0 / LOA)**0.75 - 0.75) * (x[x < 1.0] / 1.0)
ys[x >= 6.3] = 0

ax2.plot(x, ys, color=cor_casco, lw=2)
ax2.plot(x, -ys, color=cor_casco, lw=2)
ax2.plot([0, 0], [-0.75, 0.75], color=cor_casco, lw=2) # espelho

# Longitudinais (3 por bordo)
for frac in [0.25, 0.50, 0.75]:
    ax2.plot(x, ys * frac, color='#2563EB', ls='-', lw=1, alpha=0.8)
    ax2.plot(x, -ys * frac, color='#2563EB', ls='-', lw=1, alpha=0.8)

# Cavernas no Topo
for xc in x_cavernas:
    y_c = np.interp(xc, x, ys)
    ax2.plot([xc, xc], [-y_c, y_c], color=cor_caverna, lw=0.8, alpha=0.7)

# Anteparas no Topo
for x_ant in [0.63, 5.67]:
    y_a = np.interp(x_ant, x, ys)
    ax2.plot([x_ant, x_ant], [-y_a, y_a], color=cor_antepara, lw=2.5)

# Linha de Centro
ax2.axhline(0, color=cor_casco, ls='-.', lw=1)

ax2.set_title('PLANTA DO ARRANJO DE CAVERNAS E LONGITUDINAIS', fontsize=10, fontweight='bold', color=cor_casco, pad=8)
ax2.set_xlabel('Comprimento a partir da Popa (m)', fontsize=8, color=cor_casco)
ax2.set_ylabel('Meia-Boca (m)', fontsize=8, color=cor_casco)
ax2.set_xlim(-0.3, 6.6)
ax2.set_ylim(-1.45, 1.45)
ax2.grid(True, color=cor_grid, ls='-', lw=0.5)

plt.tight_layout()
img_long_path = os.path.join(pasta, "arranjo_longitudinal.png")
plt.savefig(img_long_path, bbox_inches='tight')
plt.close()

# -------------------------------------------------------------
# 2. Gerar Diagrama 2: Seção Mestra Estrutural & Escantilhões
# -------------------------------------------------------------
fig, ax = plt.subplots(figsize=(8, 5.5), dpi=200)
fig.patch.set_facecolor('#FFFFFF')
ax.set_facecolor('#F8FAFC')

# Coordenadas da seção mestra (meia-nau)
# Boca = 2.45m, Fundo chato/bojo = 1.96m, Pontal = 0.95m
y_costado = np.array([-1.225, -0.98, -0.50, 0.0, 0.50, 0.98, 1.225])
z_costado = np.array([0.95, 0.15, 0.02, 0.0, 0.02, 0.15, 0.95])

# Casco exterior
ax.plot(y_costado, z_costado, color='#1A2B4C', lw=3.5, label='Tabuado do Casco (19,0 mm)')
# Convés
ax.plot([-1.225, 1.225], [0.95, 0.95], color='#8B5A2B', lw=2.5, label='Convés de Madeira (16,0 mm)')

# Quilha maciça central
quilha_rect = patches.Rectangle((-0.075, -0.08), 0.15, 0.10, linewidth=1.5, edgecolor='#451A03', facecolor='#B45309', label='Quilha Maciça (150 x 80 mm)')
ax.add_patch(quilha_rect)

# Hastilha na linha de centro
hastilha = patches.Polygon([[-0.45, 0.18], [0.45, 0.18], [0.35, 0.02], [-0.35, 0.02]], linewidth=1.2, edgecolor='#1E3A8A', facecolor='#93C5FD', alpha=0.8, label='Hastilha (19x90 + chapuz 40x19 mm)')
ax.add_patch(hastilha)

# Cavernas do costado (curvadas nos bordos)
ax.plot([-1.20, -0.96, -0.45], [0.93, 0.17, 0.04], color='#D97706', lw=2.5, label='Caverna do Costado (19 x 90 mm)')
ax.plot([1.20, 0.96, 0.45], [0.93, 0.17, 0.04], color='#D97706', lw=2.5)

# Vau do convés
vau = patches.Rectangle((-1.15, 0.83), 2.30, 0.10, linewidth=1.2, edgecolor='#15803D', facecolor='#86EFAC', alpha=0.7, label='Vau do Convés (19x150 + chapuz 40x19 mm)')
ax.add_patch(vau)

# Longitudinais de fundo (3 por bordo)
for y_long in [-0.75, -0.50, -0.25, 0.25, 0.50, 0.75]:
    z_l = 0.02 if abs(y_long) < 0.6 else 0.08
    rect = patches.Rectangle((y_long - 0.015, z_l), 0.03, 0.04, linewidth=1, edgecolor='#1E40AF', facecolor='#3B82F6')
    ax.add_patch(rect)
# proxy label para longitudinais
ax.plot([], [], color='#3B82F6', marker='s', ls='', label='Longitudinais de Fundo (19 x 32 mm)')

# DWL
ax.axhline(0.32, color='#0284C7', ls='--', lw=1.5, label='Linha d\'Água (DWL = 32 cm)')
ax.axvline(0, color='#64748B', ls='-.', lw=1, label='Linha de Centro (CL)')

# Cotas
ax.annotate('', xy=(-1.225, 1.08), xytext=(1.225, 1.08), arrowprops=dict(arrowstyle='<->', color='#1E293B', lw=1.2))
ax.text(0, 1.12, 'Boca Máxima = 2.450 mm', ha='center', fontsize=8.5, fontweight='bold', color='#1E293B')

ax.annotate('', xy=(1.35, 0), xytext=(1.35, 0.95), arrowprops=dict(arrowstyle='<->', color='#1E293B', lw=1.2))
ax.text(1.40, 0.475, 'Pontal = 950 mm', va='center', fontsize=8.5, fontweight='bold', color='#1E293B')

ax.annotate('', xy=(-1.35, 0), xytext=(-1.35, 0.32), arrowprops=dict(arrowstyle='<->', color='#0284C7', lw=1.2))
ax.text(-1.40, 0.16, 'Calado = 320 mm', va='center', ha='right', fontsize=8.5, fontweight='bold', color='#0284C7')

ax.set_title('SEÇÃO MESTRA ESTRUTURAL — ESCANTILHÕES E DETALHES DE REFORÇOS', fontsize=10, fontweight='bold', color=cor_casco, pad=12)
ax.set_xlim(-1.6, 1.6)
ax.set_ylim(-0.15, 1.25)
ax.set_aspect('equal')
ax.grid(True, color=cor_grid, ls='-', lw=0.5)
ax.legend(loc='lower center', bbox_to_anchor=(0.5, -0.28), ncol=3, fontsize=7, frameon=True)

plt.tight_layout()
img_sec_path = os.path.join(pasta, "secao_mestra_estrutural.png")
plt.savefig(img_sec_path, bbox_inches='tight')
plt.close()

print("Imagens salvas!")

# -------------------------------------------------------------
# 3. Compilar Relatório PDF com Imagens e Memória Estrutural
# -------------------------------------------------------------
pdf_path = os.path.join(pasta, "Arranjo_Estrutural_Antonio_Manoel_Costa.pdf")

doc = SimpleDocTemplate(
    pdf_path,
    pagesize=A4,
    leftMargin=1.5*cm,
    rightMargin=1.5*cm,
    topMargin=1.5*cm,
    bottomMargin=1.5*cm
)

styles = getSampleStyleSheet()

AZUL_ESCURO = colors.HexColor("#1A2B4C")
AZUL_MEDIO = colors.HexColor("#2E5B88")
DOURADO = colors.HexColor("#C59B27")
CINZA_FUNDO = colors.HexColor("#F8FAFC")
CINZA_LINHA = colors.HexColor("#CBD5E1")
CINZA_TEXTO = colors.HexColor("#334155")

title_style = ParagraphStyle(
    'DocTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=18,
    leading=22,
    textColor=AZUL_ESCURO,
    spaceAfter=2
)

subtitle_style = ParagraphStyle(
    'DocSubtitle',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=10.5,
    leading=14,
    textColor=DOURADO,
    spaceAfter=10
)

h1_style = ParagraphStyle(
    'Heading1_Custom',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=12,
    leading=15,
    textColor=AZUL_ESCURO,
    spaceBefore=8,
    spaceAfter=5,
    keepWithNext=True
)

body_style = ParagraphStyle(
    'Body_Custom',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=8.5,
    leading=12,
    textColor=CINZA_TEXTO,
    spaceAfter=4
)

cell_bold = ParagraphStyle('CBold', fontName='Helvetica-Bold', fontSize=7.5, leading=10, textColor=AZUL_ESCURO)
cell_norm = ParagraphStyle('CNorm', fontName='Helvetica', fontSize=7.5, leading=10, textColor=CINZA_TEXTO)

story = []

# Cabeçalho
story.append(Paragraph("ARRANJO ESTRUTURAL E DIMENSIONAMENTO DO MADEIRAMENTO", title_style))
story.append(Paragraph("PROJETO NAVAL: SAVEIRO COSTEIRO BAIANO 6,30m — MEMÓRIA DE CÁLCULO E PRANCHAS", subtitle_style))
story.append(HRFlowable(width="100%", thickness=1.5, color=DOURADO, spaceAfter=8))

# Dados do Projeto
meta_table_data = [
    [Paragraph("<b>Projetista:</b>", cell_bold), Paragraph("Antônio Manoel Costa", cell_norm),
     Paragraph("<b>Material:</b>", cell_bold), Paragraph("Madeira Maciça Tradicional", cell_norm)],
    [Paragraph("<b>Embarcação:</b>", cell_bold), Paragraph("Saveiro Costeiro 6,30 m (Passageiros/Lazer)", cell_norm),
     Paragraph("<b>Norma Base:</b>", cell_bold), Paragraph("ABS Offshore Yachts / Dave Gerr Sn", cell_norm)]
]
t_meta = Table(meta_table_data, colWidths=[2.5*cm, 6.5*cm, 2.5*cm, 6.5*cm])
t_meta.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), CINZA_FUNDO),
    ('BOX', (0,0), (-1,-1), 0.5, CINZA_LINHA),
    ('PADDING', (0,0), (-1,-1), 4),
    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]))
story.append(t_meta)
story.append(Spacer(1, 6))

# Prancha 1: Imagem Longitudinal
story.append(Paragraph("1. Prancha de Arranjo Estrutural Longitudinal (Perfil & Cavername)", h1_style))
story.append(Image(img_long_path, width=18*cm, height=9.8*cm))
story.append(Spacer(1, 6))

# Prancha 2: Imagem Seção Mestra
story.append(Paragraph("2. Seção Mestra Estrutural & Escantilhões de Reforço", h1_style))
story.append(Image(img_sec_path, width=15*cm, height=9.5*cm))
story.append(Spacer(1, 8))

# Página 2: Tabela de Escantilhões e Pesos
story.append(PageBreak())
story.append(Paragraph("3. Tabela Resumo de Escantilhões, Reforços e Pesos Estruturais", h1_style))

t_esc_data = [
    [Paragraph("<b>Elemento Estrutural</b>", cell_bold),
     Paragraph("<b>Dimensão / Seção</b>", cell_bold),
     Paragraph("<b>Espaçamento / Regra</b>", cell_bold),
     Paragraph("<b>Critério / Norma</b>", cell_bold),
     Paragraph("<b>Peso Estimado</b>", cell_bold)],
    
    [Paragraph("Tabuado do Fundo", cell_norm), Paragraph("19,0 mm (3/4'')", cell_norm), Paragraph("Painel 210 x 234 mm", cell_norm), Paragraph("ABS Pressão Hidrostática (FS=2,53)", cell_norm), Paragraph("142 kg", cell_norm)],
    [Paragraph("Tabuado do Costado", cell_norm), Paragraph("19,0 mm (3/4'')", cell_norm), Paragraph("Cavernas a 210 mm", cell_norm), Paragraph("ABS Mínimo Construtivo", cell_norm), Paragraph("118 kg", cell_norm)],
    [Paragraph("Espelho de Popa", cell_norm), Paragraph("16,0 mm (5/8'')", cell_norm), Paragraph("Reforçado p/ motor", cell_norm), Paragraph("Regra Dave Gerr", cell_norm), Paragraph("28 kg", cell_norm)],
    [Paragraph("Convés", cell_norm), Paragraph("16,0 mm (5/8'')", cell_norm), Paragraph("Vaus a 210 mm", cell_norm), Paragraph("Carga de Pessoas / ABS", cell_norm), Paragraph("34 kg", cell_norm)],
    [Paragraph("Quilha Maciça", cell_norm), Paragraph("150 x 80 mm", cell_norm), Paragraph("Linha de Centro contínua", cell_norm), Paragraph("Regra Tradicional do Graminho", cell_norm), Paragraph("48 kg", cell_norm)],
    [Paragraph("Longitudinais do Fundo", cell_norm), Paragraph("19 x 32 mm", cell_norm), Paragraph("3 por bordo (a cada 234 mm)", cell_norm), Paragraph("Módulo SM = 1,5 cm³", cell_norm), Paragraph("32 kg", cell_norm)],
    [Paragraph("Cavernas do Costado (Balizas)", cell_norm), Paragraph("19 x 90 mm", cell_norm), Paragraph("29 cavernas a cada 210 mm", cell_norm), Paragraph("Módulo SM = 18,0 cm³", cell_norm), Paragraph("112 kg", cell_norm)],
    [Paragraph("Hastilhas Centrais", cell_norm), Paragraph("19x90 + chapuz 40x19", cell_norm), Paragraph("Sobre quilha a cada 210 mm", cell_norm), Paragraph("Módulo SM = 33,9 cm³", cell_norm), Paragraph("38 kg", cell_norm)],
    [Paragraph("Vaus do Convés", cell_norm), Paragraph("19x150 + chapuz 40x19", cell_norm), Paragraph("Sobre balizas a cada 210 mm", cell_norm), Paragraph("Módulo SM = 88,7 cm³", cell_norm), Paragraph("41 kg", cell_norm)],
    [Paragraph("Antepara de Vante (Proa)", cell_norm), Paragraph("Chapa 19,0 mm (0,20 m²)", cell_norm), Paragraph("3ª caverna (5,67 m do espelho)", cell_norm), Paragraph("10% LOA / Estanque", cell_norm), Paragraph("6 kg", cell_norm)],
    [Paragraph("Antepara de Ré (Popa)", cell_norm), Paragraph("Chapa 19,0 mm (1,28 m²)", cell_norm), Paragraph("3ª caverna (0,63 m do espelho)", cell_norm), Paragraph("10% LOA / Estanque", cell_norm), Paragraph("18 kg", cell_norm)],
    [Paragraph("<b>TOTAL ESTRUTURA NUA</b>", cell_bold), Paragraph("<b>Madeira Maciça</b>", cell_bold), Paragraph("<b>29 Cavernas / 6 Long.</b>", cell_bold), Paragraph("<b>56,3% do Deslocamento</b>", cell_bold), Paragraph("<b>617 kg</b>", cell_bold)],
    [Paragraph("<b>TOTAL COM MARGEM (+12%)</b>", cell_bold), Paragraph("<b>Fixadores / Resina</b>", cell_bold), Paragraph("<b>Margem Construtiva</b>", cell_bold), Paragraph("<b>LCG=2,65m | VCG=0,69m</b>", cell_bold), Paragraph("<b>691 kg</b>", cell_bold)]
]

t_esc = Table(t_esc_data, colWidths=[3.8*cm, 3.5*cm, 4.0*cm, 4.2*cm, 2.5*cm])
t_esc.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), AZUL_ESCURO),
    ('TEXTCOLOR', (0,0), (-1,0), colors.white),
    ('GRID', (0,0), (-1,-1), 0.5, CINZA_LINHA),
    ('BACKGROUND', (0,-2), (-1,-1), colors.HexColor("#FEF3C7")),
    ('PADDING', (0,0), (-1,-1), 3.5),
    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]))
story.append(t_esc)
story.append(Spacer(1, 10))

# Notas e Recomendações Construtivas
story.append(Paragraph("4. Recomendações e Técnicas da Carpintaria Naval Tradicional", h1_style))
notas_texto = """
• <b>Madeiras Recomendadas:</b> Para a quilha, roda de proa e cadaste recomenda-se Sucupira ou Oiti; para o cavername e hastilhas, Sucupira ou Jaqueira; para o tabuado do casco (costado e fundo), Jaqueira, Louro-Canela ou Cedro naval.<br/>
• <b>Fixações:</b> Cravos de cobre batidos com arruela ou parafusos em bronze silício / aço inox 316 para evitar corrosão galvânica.<br/>
• <b>Calafeto:</b> Estopa de algodão ou biriba emassada com breu e óleo de linhaça/dendê tradicional, garantindo perfeita estanqueidade.<br/>
• <b>Anteparas de Colisão:</b> Posicionadas a 10% das extremidades (0,63 m da popa e 5,67 m do espelho), conferindo compartimentação estanque de segurança contra alagamento acidental.
"""
story.append(Paragraph(notas_texto, body_style))

doc.build(story)
print(f"PDF consolidado gerado em: {pdf_path}")
