import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.path import Path
import numpy as np

# Configuração da figura A3 paisagem com alta definição
fig, (ax_top, ax_side) = plt.subplots(2, 1, figsize=(14, 10), dpi=200, gridspec_kw={'height_ratios': [1, 1.2]})

# Cores e Estilos Brana
C_NAVY = '#0F2A4A'
C_BLUE = '#1D70B8'
C_WOOD = '#8C5E32'
C_WOOD_LIGHT = '#D4A373'
C_DECK = '#F4EDE2'
C_WATER = '#E0F2FE'
C_GRID = '#E2E8F0'

# ==========================================
# 1. VISTA SUPERIOR (PLANTA DE CONVÉS / ARRANJO GERAL)
# ==========================================
ax_top.set_title("ARRANJO GERAL — PLANTA DE CONVÉS (DAY RACER 5,80 m)", fontsize=11, fontweight='bold', color=C_NAVY, pad=12)

# Linha do Casco (Planta)
x_casco = np.linspace(0, 5.8, 100)
# Curva da borda
y_borda = 0.95 * np.sqrt(1 - ((x_casco - 2.6)/3.3)**2) * (1 - 0.25*(x_casco/5.8)**2)
y_borda[x_casco < 0] = 0.64
# Interpolação suave real
xs = np.array([0.0, 1.16, 2.32, 2.60, 3.48, 4.64, 5.8])
ys = np.array([0.64, 0.85, 0.95, 0.95, 0.88, 0.63, 0.0])
p_poly = np.poly1d(np.polyfit(xs, ys, 4))
y_curve = p_poly(x_casco)
y_curve[y_curve < 0] = 0
y_curve[0] = 0.64

# Desenha casco e convés
ax_top.fill_between(x_casco, -y_curve, y_curve, color=C_DECK, ec=C_NAVY, lw=2, zorder=2)
ax_top.plot([0, 0], [-0.64, 0.64], color=C_NAVY, lw=2.5, zorder=3) # Espelho de popa

# Ripado de Madeira no Convés (Cockpit e Proa)
for y_ripa in np.linspace(-0.85, 0.85, 25):
    # Traça ripas onde cai dentro do casco
    x_valid = x_casco[y_curve >= abs(y_ripa)]
    if len(x_valid) > 1:
        ax_top.plot(x_valid, [y_ripa]*len(x_valid), color='#E6D5C3', lw=0.6, zorder=2.5)

# Divisões de Convés:
# 1. Caixa de proa / Deck seco (0 a 1,60 m da proa -> x de 4.2 a 5.8)
ax_top.plot([4.2, 4.2], [-p_poly(4.2), p_poly(4.2)], color=C_NAVY, lw=1.5, ls='--', zorder=4)
ax_top.text(4.8, 0, "Bico de Proa\n(Estanque / Flutuação)", ha='center', va='center', fontsize=7.5, color='#555555', zorder=5)

# 2. Posição do Mastro (x = 4.10 m)
mastro_circ = plt.Circle((4.10, 0), 0.08, color='#333333', ec=C_NAVY, lw=1.5, zorder=6)
ax_top.add_patch(mastro_circ)
ax_top.text(4.10, 0.35, "Mastro (Vela de Içar)\n(Sapata / Tabernacle)", ha='center', va='bottom', fontsize=7.5, fontweight='bold', color=C_NAVY, zorder=6)

# 3. Caixa de Bolina (x = 2.40 a 3.20 m)
bolina_box = patches.Rectangle((2.40, -0.08), 0.80, 0.16, color=C_WOOD, ec=C_NAVY, lw=1.2, zorder=5)
ax_top.add_patch(bolina_box)
ax_top.text(2.80, 0, "Caixa de Bolina", ha='center', va='center', fontsize=7, color='white', fontweight='bold', zorder=6)

# 4. Cockpit / Bancos Laterais para 2 Tripulantes (x = 0.40 a 4.00 m)
banco_bb = patches.Polygon([[0.4, 0.45], [3.9, 0.45], [3.9, 0.78], [0.4, 0.58]], color=C_WOOD_LIGHT, ec=C_NAVY, lw=1, zorder=4)
banco_be = patches.Polygon([[0.4, -0.45], [3.9, -0.45], [3.9, -0.78], [0.4, -0.58]], color=C_WOOD_LIGHT, ec=C_NAVY, lw=1, zorder=4)
ax_top.add_patch(banco_bb)
ax_top.add_patch(banco_be)
ax_top.text(2.0, 0.62, "Banco de Bordo (Boreste) — Posição de Escoteiro", ha='center', va='center', fontsize=7, color=C_NAVY, zorder=5)
ax_top.text(2.0, -0.62, "Banco de Bordo (Bombordo) — Posição de Timoneiro", ha='center', va='center', fontsize=7, color=C_NAVY, zorder=5)

# 5. Trilho do Carro de Escota da Vela na Popa (x = 0.50 m)
ax_top.plot([0.50, 0.50], [-0.55, 0.55], color='#333333', lw=3, zorder=5)
carro_box = patches.Rectangle((0.46, -0.08), 0.08, 0.16, color='#E63946', ec=C_NAVY, lw=1, zorder=6)
ax_top.add_patch(carro_box)
ax_top.text(0.50, 0.20, "Trilho da Escota (1,10 m)", ha='left', va='center', fontsize=7, color='#333333', zorder=6)

# 6. Cana do Leme (x = 0 a 1.20 m)
ax_top.plot([0, 1.20], [0, 0], color=C_WOOD, lw=3.5, zorder=6)
ax_top.plot([-0.25, 0], [0, 0], color='#222222', lw=4, zorder=6) # Ferragem do leme
ax_top.text(0.9, -0.15, "Cana do Leme", ha='center', va='top', fontsize=7.5, fontweight='bold', color=C_NAVY, zorder=6)

# Estilização Top View
ax_top.set_xlim(-0.6, 6.2)
ax_top.set_ylim(-1.25, 1.25)
ax_top.set_xlabel("Comprimento Longitudinal X (m)", fontsize=8.5)
ax_top.set_ylabel("Meia-Boca Y (m)", fontsize=8.5)
ax_top.grid(True, ls=':', color=C_GRID)
ax_top.set_aspect('equal')

# ==========================================
# 2. VISTA DE PERFIL (ELEVAÇÃO LATERAL + PLANO VÉLICO BÁSICO)
# ==========================================
ax_side.set_title("ARRANJO DE PERFIL — ELEVAÇÃO LATERAL E PLANO VÉLICO (VELA DE IÇAR)", fontsize=11, fontweight='bold', color=C_NAVY, pad=12)

# Linhas do Casco (Perfil)
# Borda Livre
x_prof = np.linspace(0, 5.8, 100)
z_borda = 0.68 + 0.035*(x_prof/5.8) + 0.155*(x_prof/5.8)**2
# Linha da Quilha
z_quilha = 0.12 - 0.12*(x_prof/2.32) + 0.45*((x_prof-2.32)/3.48)**2 * (x_prof >= 2.32)
z_quilha[x_prof < 2.32] = 0.12 * (1 - x_prof[x_prof < 2.32]/2.32)

# Desenha casco
ax_side.fill_between(x_prof, z_quilha, z_borda, color='#F7FAFC', ec=C_NAVY, lw=2, zorder=3)
ax_side.plot([0, 0], [0.12, 0.68], color=C_NAVY, lw=2.5, zorder=4) # Popa

# Linha d'Água de Projeto (DWL a Z = 0.25 m)
ax_side.axhline(0.25, color=C_BLUE, lw=1.5, ls='-.', zorder=4, label="Linha d'Água de Projeto (Calado 0,25 m)")
ax_side.fill_between([-0.5, 6.0], -1.3, 0.25, color=C_WATER, alpha=0.4, zorder=1)

# Bolina Rebaixada (x = 2.40 a 3.10 m, desce até z = -0.85 m -> calado total 1,10 m)
bolina_poly = patches.Polygon([[2.50, 0.10], [3.10, 0.10], [2.80, -0.85], [2.40, -0.85]], color='#CBD5E1', ec=C_NAVY, lw=1.5, zorder=2)
ax_side.add_patch(bolina_poly)
ax_side.text(2.75, -0.40, "Bolina Perfilada\n(Calado Total: 1,10 m)", ha='center', va='center', fontsize=7.5, fontweight='bold', color=C_NAVY, zorder=5)

# Leme Externo de Popa (Transom-hung)
leme_poly = patches.Polygon([[0, 0.68], [-0.25, 0.65], [-0.35, -0.45], [-0.10, -0.45], [0, 0.12]], color='#CBD5E1', ec=C_NAVY, lw=1.5, zorder=4)
ax_side.add_patch(leme_poly)
ax_side.plot([0, 1.20], [0.72, 0.72], color=C_WOOD, lw=3, zorder=5) # Cana do leme
ax_side.text(-0.25, 0.10, "Leme de Popa\n(Compensado)", ha='right', va='center', fontsize=7, color=C_NAVY, zorder=5)

# MASTREAÇÃO E VELA DE IÇAR
# Mastro (x = 4.10 m, altura de z=0.75 até z=5.80 m -> 5,05 m de mastro)
ax_side.plot([4.10, 4.10], [0.75, 5.80], color='#4A3525', lw=4.5, zorder=5)
ax_side.text(4.18, 5.60, "Mastro (5,05 m)", fontsize=7.5, fontweight='bold', color=C_NAVY, zorder=6)

# Verga Superior de Içar (inclinada tradicional)
# Vai de x=4.70, z=3.80 até x=1.10, z=6.40
ax_side.plot([4.70, 1.10], [3.80, 6.40], color=C_WOOD, lw=3.5, zorder=5)
ax_side.text(2.80, 5.30, "Verga de Içar (4,40 m)", fontsize=7.5, color='#4A3525', rotation=-36, zorder=6)

# Retranca / Esteira da Vela (x=4.00, z=1.10 até x=0.20, z=1.35)
ax_side.plot([4.00, 0.20], [1.10, 1.35], color=C_WOOD, lw=3, zorder=5)
ax_side.text(2.10, 1.45, "Retranca / Esteira (3,80 m)", fontsize=7.5, color='#4A3525', zorder=6)

# Polígono da Vela de Içar (Área ~ 17.5 m²)
vela_pts = [[4.00, 1.10], [4.70, 3.80], [1.10, 6.40], [0.20, 1.35]]
vela_poly = patches.Polygon(vela_pts, color='#FFFDF9', ec=C_BLUE, lw=1.8, alpha=0.9, zorder=4)
ax_side.add_patch(vela_poly)

# Costuras/Linhas de Pano da Vela
for f in [0.25, 0.50, 0.75]:
    p_inf = np.array([4.00, 1.10])*(1-f) + np.array([0.20, 1.35])*f
    p_sup = np.array([4.70, 3.80])*(1-f) + np.array([1.10, 6.40])*f
    ax_side.plot([p_inf[0], p_sup[0]], [p_inf[1], p_sup[1]], color='#93C5FD', lw=0.8, ls=':', zorder=4.5)

# Centro Vélico (CE)
ax_side.plot(2.65, 3.10, marker='o', markersize=6, color='#E63946', zorder=6)
ax_side.text(2.75, 3.10, "CE (Centro Vélico)\nÁrea = 17,5 m²", fontsize=7.5, fontweight='bold', color='#E63946', zorder=6)

# Estilização Side View
ax_side.set_xlim(-0.6, 6.2)
ax_side.set_ylim(-1.1, 6.8)
ax_side.set_xlabel("Comprimento Longitudinal X (m)", fontsize=8.5)
ax_side.set_ylabel("Altura Z acima da Linha Base (m)", fontsize=8.5)
ax_side.grid(True, ls=':', color=C_GRID)
ax_side.legend(loc='upper right', fontsize=8)

plt.tight_layout()
plt.savefig('/home/magdalena/eee/alunos/47356812742818-maximo/Arranjo_Geral_Perfil_Maximo.png', dpi=200)
plt.savefig('/home/magdalena/eee/alunos/47356812742818-maximo/Arranjo_Geral_Perfil_Maximo.jpg', dpi=200)
print("Prancha de Arranjo Geral e Perfil gerada com sucesso!")
