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

# Configuração da figura A3 paisagem com alta definição técnica
fig, (ax_top, ax_side) = plt.subplots(2, 1, figsize=(15, 11), dpi=220, gridspec_kw={'height_ratios': [1, 1.35]})

# Paleta Náutica Brana / Tradicional
C_NAVY = '#0F2A4A'
C_BLUE = '#1D70B8'
C_WOOD_DARK = '#5C3A21'
C_WOOD_MID = '#8C5E32'
C_WOOD_LIGHT = '#D4A373'
C_TIJUPA = '#E29578'
C_DECK = '#F4EDE2'
C_WATER = '#E0F2FE'
C_GRID = '#E2E8F0'
C_RED = '#C0392B'

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

# Curva da Borda (Planta)
x_casco = np.linspace(0, 5.8, 120)
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

# Casco base
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 reto

# Ripado do Convés
for y_ripa in np.linspace(-0.88, 0.88, 27):
    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='#E8DCCF', lw=0.6, zorder=2.5)

# 1. Bico de Proa / Capelo & Roda de Proa (x = 4.60 a 5.80 m)
ax_top.plot([4.60, 4.60], [-p_poly(4.60), p_poly(4.60)], color=C_NAVY, lw=1.5, ls='--', zorder=4)
ax_top.text(5.15, 0, "Bico de Proa\n(Estanque / Flutuação)", ha='center', va='center', fontsize=7.5, color='#444444', zorder=5)

# 2. Mastro à Vante (x = 4.35 m) com Sapata/Encaixe Tradicional
mastro_circ = plt.Circle((4.35, 0), 0.09, color=C_WOOD_DARK, ec=C_NAVY, lw=1.5, zorder=7)
ax_top.add_patch(mastro_circ)
ax_top.text(4.35, 0.40, "Mastro (x = 4,35 m)\nSapata Reforçada", ha='center', va='bottom', fontsize=7.5, fontweight='bold', color=C_NAVY, zorder=8)

# 3. Tijupá Tradicional Rebaixado / Cobertura Central (x = 2.20 a 4.10 m)
tijupa_rect = patches.Rectangle((2.20, -0.38), 1.90, 0.76, color=C_WOOD_MID, ec=C_NAVY, lw=1.2, zorder=5)
ax_top.add_patch(tijupa_rect)
ax_top.text(3.15, 0, "Tijupá Rebaixado (Porão Seco / Caixa de Bolina)", ha='center', va='center', fontsize=7.5, color='white', fontweight='bold', zorder=6)

# 4. Passadiços Laterais de Barlavento / Escoramento (Boreste e Bombordo)
passadico_bb = patches.Polygon([[0.4, 0.42], [4.4, 0.42], [4.4, 0.72], [0.4, 0.58]], color=C_WOOD_LIGHT, ec=C_NAVY, lw=1, zorder=4)
passadico_be = patches.Polygon([[0.4, -0.42], [4.4, -0.42], [4.4, -0.72], [0.4, -0.58]], color=C_WOOD_LIGHT, ec=C_NAVY, lw=1, zorder=4)
ax_top.add_patch(passadico_bb)
ax_top.add_patch(passadico_be)
ax_top.text(1.5, 0.58, "Passadiço / Borda de Escora (Boreste)", ha='center', va='center', fontsize=7, color=C_NAVY, zorder=5)
ax_top.text(1.5, -0.58, "Passadiço / Borda de Escora (Bombordo)", ha='center', va='center', fontsize=7, color=C_NAVY, zorder=5)

# 5. Poço de Popa / Praça do Timoneiro (x = 0.30 a 2.10 m)
ax_top.text(1.15, 0, "Poço de Popa\n(Praça do Timoneiro & Escoteiro)", ha='center', va='center', fontsize=7.5, fontweight='bold', color=C_NAVY, zorder=5)

# 6. Trilho / Barreta de Escota de Popa (x = 0.50 m)
ax_top.plot([0.50, 0.50], [-0.55, 0.55], color='#222222', lw=3.5, zorder=6)
ax_top.text(0.50, 0.22, "Barreta / Trilho de Escota (1,10 m)", ha='left', va='center', fontsize=7, color='#222222', zorder=7)

# 7. Cana do Leme de Madeira Longa (x = 0 a 1.30 m)
ax_top.plot([0, 1.30], [0, 0], color=C_WOOD_DARK, lw=3.5, zorder=7)
ax_top.plot([-0.30, 0], [0, 0], color='#111111', lw=4.5, zorder=7) # Cabeça do leme
ax_top.text(1.0, -0.15, "Cana do Leme", ha='center', va='top', fontsize=7.5, fontweight='bold', color=C_NAVY, zorder=8)

# 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 DE PENA / IÇAR)
# ==========================================
ax_side.set_title("ARRANJO DE PERFIL — ELEVAÇÃO LATERAL & PLANO VÉLICO TRADICIONAL (VELA DE PENA / IÇAR)", fontsize=11, fontweight='bold', color=C_NAVY, pad=12)

# Linhas do Casco (Perfil)
x_prof = np.linspace(0, 5.8, 120)
z_borda = 0.68 + 0.03*(x_prof/5.8) + 0.16*(x_prof/5.8)**2
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)

# Casco em perfil
ax_side.fill_between(x_prof, z_quilha, z_borda, color='#F8FAFC', ec=C_NAVY, lw=2, zorder=3)
ax_side.plot([0, 0], [0.12, 0.68], color=C_NAVY, lw=2.5, zorder=4)

# Tijupá no perfil (x = 2.20 a 4.10, eleva 15 cm acima da borda)
x_tij = np.linspace(2.20, 4.10, 30)
z_tij_base = 0.68 + 0.03*(x_tij/5.8) + 0.16*(x_tij/5.8)**2
z_tij_top = z_tij_base + 0.16 * np.sin(np.pi * (x_tij - 2.20)/1.90)
ax_side.fill_between(x_tij, z_tij_base, z_tij_top, color=C_WOOD_LIGHT, ec=C_WOOD_DARK, lw=1.2, zorder=4)
ax_side.text(3.15, 0.88, "Tijupá (+0,16 m)", ha='center', va='bottom', fontsize=7, color=C_WOOD_DARK, fontweight='bold', zorder=5)

# 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 do Casco 0,25 m)")
ax_side.fill_between([-0.5, 6.0], -1.3, 0.25, color=C_WATER, alpha=0.35, 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 com Cana
leme_poly = patches.Polygon([[0, 0.68], [-0.28, 0.65], [-0.38, -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.30], [0.72, 0.72], color=C_WOOD_DARK, lw=3, zorder=5) # Cana
ax_side.text(-0.25, 0.10, "Leme Externo\n(Pá Compensada)", ha='right', va='center', fontsize=7, color=C_NAVY, zorder=5)

# ==========================================
# MASTREAÇÃO & VELA DE PENA / IÇAR TRADICIONAL
# ==========================================
# Mastro Robusto Curto (x = 4.35 m, vai de z=0.75 até z=5.20 m -> 4,45 m)
ax_side.plot([4.35, 4.35], [0.75, 5.20], color=C_WOOD_DARK, lw=5.0, zorder=5)
ax_side.text(4.42, 5.05, "Mastro (4,45 m)", fontsize=7.5, fontweight='bold', color=C_NAVY, zorder=6)

# Verga de Içar / Pena Empinada (Muito longa: vai de x=4.75, z=2.20 até x=0.60, z=7.40 -> ~6,70 m)
ax_side.plot([4.75, 0.60], [2.20, 7.40], color=C_WOOD_MID, lw=3.8, zorder=6)
ax_side.text(2.40, 5.50, "Verga de Pena / Içar (6,70 m — Inclinada a ~55°)", fontsize=7.5, fontweight='bold', color=C_WOOD_DARK, rotation=-51, zorder=7)

# Esteira Arqueada da Vela (Gualdropa côncava típica dos saveiros)
# Ponto da amura: x=4.75, z=2.20 | Ponto da escota: x=0.20, z=1.45
x_guald = np.linspace(0.20, 4.75, 60)
# Arco para visibilidade sob a vela
z_guald = 1.45 + (2.20 - 1.45)*((x_guald - 0.20)/(4.75 - 0.20)) + 0.35 * np.sin(np.pi * (x_guald - 0.20)/(4.75 - 0.20))

# Monta o contorno da vela
x_sail = np.concatenate([[4.75], np.linspace(4.75, 0.60, 40), [0.60], x_guald[::-1]])
z_sail = np.concatenate([[2.20], np.linspace(2.20, 7.40, 40), [7.40], z_guald[::-1]])
ax_side.fill(x_sail, z_sail, color='#FFFDF9', ec=C_BLUE, lw=1.8, alpha=0.92, zorder=4)

# Costuras/Painéis Verticais de Pano
for fx in np.linspace(0.15, 0.85, 6):
    x_top_pt = 4.75*(1-fx) + 0.60*fx
    z_top_pt = 2.20*(1-fx) + 7.40*fx
    x_bot_pt = 4.75*(1-fx) + 0.20*fx
    z_bot_pt = np.interp(x_bot_pt, x_guald, z_guald)
    ax_side.plot([x_top_pt, x_bot_pt], [z_top_pt, z_bot_pt], color='#BFDBFE', lw=0.8, ls=':', zorder=4.5)

# Centro Vélico (CE)
ax_side.plot(2.60, 3.85, marker='o', markersize=6.5, color=C_RED, zorder=7)
ax_side.text(2.70, 3.85, "CE (Centro Vélico)\nÁrea = 18,2 m²", fontsize=7.5, fontweight='bold', color=C_RED, zorder=7)

# Cabos de Manobra: Driça da verga, Amura e Escota
ax_side.plot([4.35, 2.70], [5.15, 4.75], color='#777777', lw=1.2, ls='--', zorder=5) # Driça
ax_side.plot([0.20, 0.50], [1.45, 0.72], color='#777777', lw=1.2, ls='-', zorder=5) # Escota

# Anotações dos Tripulantes (Posições de Regata)
ax_side.text(1.20, 0.80, "Timoneiro\n(Escora na ré)", ha='center', va='bottom', fontsize=7, color=C_NAVY, fontweight='bold', zorder=6)
ax_side.text(3.50, 0.95, "Escoteiro / Proeiro\n(Escora na meia-nau)", ha='center', va='center', fontsize=7, color=C_NAVY, fontweight='bold', zorder=6)

# Estilização Side View
ax_side.set_xlim(-0.6, 6.2)
ax_side.set_ylim(-1.1, 7.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_Saveiro_580.png', dpi=220)
plt.savefig('/home/magdalena/eee/alunos/47356812742818-maximo/Arranjo_Geral_Perfil_Saveiro_580.jpg', dpi=220)
print("Prancha de Arranjo Geral e Perfil Saveiro gerada com sucesso!")
