import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np

# Configurar prancha técnica do Plano Vélico
plt.style.use('seaborn-v0_8-whitegrid' if 'seaborn-v0_8-whitegrid' in plt.style.available else 'default')
fig = plt.figure(figsize=(16, 11), dpi=300)

c_hull = '#0F2A4A'       # Azul Marinho Brana
c_bottom = '#B91C1C'     # Vermelho Óxido
c_wood = '#B45309'       # Mastro e Pena (Madeira)
c_sail = '#FFFDF5'       # Lona da Vela
c_rig = '#1E293B'        # Cabos / Brandais
c_dim = '#DC2626'        # Cotas vermelhas
c_wl = '#0284C7'         # Linha d'Água

ax = fig.add_subplot(1, 1, 1)
ax.set_title("PLANO VÉLICO TRADICIONAL — SAVEIRO DAY RACER (5,80 m)\nArmação Latina Baiana (Vela de Pena / Içar) | Proporções em Escala Real (Metros) e Escala 1:25 (Centímetros)", fontsize=11, fontweight='bold', color='#0F172A', pad=12)

# 1. CASCO DO SAVEIRO DE 5,80 m (Perfil)
# Popa em x = 0, Proa em x = 5.80 m
xs = np.linspace(0, 5.80, 80)
# Curva da borda
sheer = 0.68 + 0.03 * (xs / 5.80) + 0.16 * (xs / 5.80)**2
# Linha do fundo (rocker)
keel_x = [0, 0, 2.32, 4.80, 5.80]
keel_y = [0.68, 0.12, 0.00, 0.20, 0.87]

# Preenchimento Casco
ax.fill(np.concatenate([xs, [5.80, 4.80, 2.32, 0, 0]]),
        np.concatenate([sheer, [0.87, 0.20, 0.00, 0.12, 0.68]]),
        color=c_hull, edgecolor='black', lw=1.8, label="Casco Saveiro 5,80 m")

# Fundo Vivo (Abaixo da WL = 0.25 m)
ax.fill([0, 0, 2.32, 4.80, 5.20, 0], [0.25, 0.12, 0.00, 0.20, 0.25, 0.25], color=c_bottom, alpha=0.9)
ax.axhline(0.25, color=c_wl, lw=1.5, linestyle='--', label="Linha d'Água (DWL = 0,25 m)")

# Bolina baixada
bolina = patches.Polygon([[2.40, 0.10], [3.10, 0.10], [2.80, -0.85], [2.40, -0.85]], color='#94A3B8', ec='black', lw=1.2)
ax.add_patch(bolina)
ax.text(2.70, -0.40, "Bolina Retrátil (Calado 1,10 m)", ha='center', va='center', fontsize=7.5, fontweight='bold', color='#0F2A4A')

# Leme externo
leme = patches.Polygon([[0, 0.68], [-0.28, 0.65], [-0.38, -0.45], [-0.10, -0.45], [0, 0.12]], color='#94A3B8', ec='black', lw=1.2)
ax.add_patch(leme)

# 2. MASTRO CURTO E ROBUSTO (Fixado a 1,45 m da proa = x = 4,35 m)
mast_base_x = 4.35
mast_base_y = 0.05
mast_head_x = 4.25
mast_head_y = 4.45
ax.plot([mast_base_x, mast_head_x], [mast_base_y, mast_head_y], color=c_wood, lw=6.5, label="Mastro Curto (H = 4,45 m total)")

# 3. A PENA / VERGA INCLINADA (Comprimento P = 7,20 m)
# Extremidade inferior (Amura na proa): x = 5.60 m, y = 0.85 m
# Extremidade superior (Penol no alto da ré): x = 0.45 m, y = 6.00 m
pen_x0, pen_y0 = 5.60, 0.85
pen_x1, pen_y1 = 0.45, 6.00
ax.plot([pen_x0, pen_x1], [pen_y0, pen_y1], color='#78350F', lw=4.5, label="Pena / Verga (P = 7,20 m)")

# 4. A VELA LATINA TRIANGULAR (Lona costurada)
# Vértice 1: Punho da Amura (5.60 m, 0.85 m)
# Vértice 2: Tope / Penol (0.45 m, 6.00 m)
# Vértice 3: Punho da Escota na Popa (0.25 m, 0.95 m)
# Curva da esteira (gualdropa côncava tradicional para visibilidade)
x_esteira = np.linspace(0.25, 5.60, 50)
y_esteira = 0.95 + (0.85 - 0.95) * ((x_esteira - 0.25)/(5.60 - 0.25)) + 0.32 * np.sin(np.pi * (x_esteira - 0.25)/(5.60 - 0.25))

sail_x = np.concatenate([[pen_x0], [pen_x1], x_esteira])
sail_y = np.concatenate([[pen_y0], [pen_y1], y_esteira])
ax.fill(sail_x, sail_y, color=c_sail, edgecolor='#D97706', lw=1.5, label="Vela de Pena (Área = 18,2 m²)")

# Costuras verticais tradicionais na vela (panos de lona)
for t in np.linspace(0.12, 0.88, 7):
    x_top = pen_x0 + t * (pen_x1 - pen_x0)
    y_top = pen_y0 + t * (pen_y1 - pen_y0)
    x_bot = pen_x0 + t * (0.25 - pen_x0)
    y_bot = np.interp(x_bot, x_esteira, y_esteira)
    ax.plot([x_top, x_bot], [y_top, y_bot], color='#D97706', lw=0.6, linestyle=':')

# Flâmula baiana no tope da pena
ax.add_patch(patches.Polygon([[pen_x1, pen_y1], [pen_x1 - 0.55, pen_y1 + 0.14], [pen_x1 - 0.45, pen_y1 - 0.14]], closed=True, facecolor='#DC2626'))

# 5. CABOS DE MANOBRA (Adriça e Escota)
# Adriça segurando a pena ao tope do mastro
ax.plot([mast_head_x, 3.45], [mast_head_y, 3.85], color=c_rig, lw=1.8)
# Escota da vela na popa
ax.plot([0.25, 0.45], [0.95, 0.72], color=c_rig, lw=1.5)

# -------------------------------------------------------------------------
# COTAS TÉCNICAS DO PLANO VÉLICO (P, E e V)
# -------------------------------------------------------------------------
# Cota P (Testa ao longo da Pena): 7,20 m
ax.annotate('', xy=(pen_x0 + 0.15, pen_y0 + 0.15), xytext=(pen_x1 + 0.15, pen_y1 + 0.15),
            arrowprops=dict(arrowstyle='<->', color=c_dim, lw=1.8))
ax.text(3.1, 3.7, 'COTA P (Testa / Pena) = 7,20 m\n(28,8 cm em 1:25)', ha='left', va='bottom', fontsize=8.5, fontweight='bold', color=c_dim, rotation=45)

# Cota E (Esteira / Base da Vela): 5,40 m
ax.annotate('', xy=(0.25, 0.65), xytext=(pen_x0, 0.65),
            arrowprops=dict(arrowstyle='<->', color=c_dim, lw=1.8))
ax.text(2.9, 0.45, 'COTA E (Esteira / Base) = 5,40 m (21,6 cm em 1:25)', ha='center', va='top', fontsize=8.5, fontweight='bold', color=c_dim)

# Cota V (Valuma / Borda Ré): 5,80 m
ax.annotate('', xy=(0.10, 1.05), xytext=(pen_x1 - 0.10, pen_y1 - 0.10),
            arrowprops=dict(arrowstyle='<->', color='#2563EB', lw=1.5))
ax.text(0.15, 3.5, 'Valuma = 5,80 m\n(23,2 cm em 1:25)', ha='left', va='center', fontsize=8, fontweight='bold', color='#2563EB', rotation=87)

# Cota Comprimento do Casco (LOA): 5,80 m
ax.annotate('', xy=(0, -0.65), xytext=(5.80, -0.65),
            arrowprops=dict(arrowstyle='<->', color='black', lw=1.2))
ax.text(2.90, -0.80, 'Comprimento do Casco (LOA) = 5,80 m (23,2 cm em 1:25)', ha='center', va='top', fontsize=8.5, fontweight='bold')

# Centro Vélico CE
ax.plot(2.65, 3.10, marker='o', markersize=7, color='#DC2626')
ax.text(2.75, 3.10, "CE (Centro Vélico)\nÁrea = 18,2 m²", fontsize=8, fontweight='bold', color='#DC2626')

# Bloco Técnico de Resumo
text_box = (
    "RESUMO TÉCNICO DO PLANO VÉLICO (SAVEIRO 5,80 m):\n"
    "• Cota P (Testa da Vela / Pena): 7,20 m\n"
    "• Cota E (Esteira / Base): 5,40 m\n"
    "• Cota V (Valuma posterior): 5,80 m\n"
    "• Altura do Mastro (Hm): 4,45 m total (3,70 m acima do convés)\n"
    "• Posição do Mastro (Xm): a 1,45 m da roda de proa (x = 4,35 m)\n"
    "• Área Vélica Total: 18,2 m² (pano tradicional)\n"
    "• Calado: 0,25 m (casco) / 1,10 m (bolina baixada)\n"
    "----------------------------------------------------\n"
    "TABELA PARA MAQUETE (ESCALA 1:25):\n"
    "• Casco (LOA): 23,2 cm\n"
    "• Boca (BOA): 7,6 cm\n"
    "• Pena / Verga (P): 28,8 cm\n"
    "• Esteira (E): 21,6 cm\n"
    "• Valuma (V): 23,2 cm\n"
    "• Altura do Mastro: 17,8 cm (vareta de 4 a 5 mm)\n"
    "• Área Vélica na Maquete: 291 cm²"
)
ax.text(0.15, 1.8, text_box, fontsize=7.6, family='monospace', color='#0F172A',
        bbox=dict(boxstyle='square,pad=0.6', facecolor='#FEF3C7', edgecolor='#D97706', lw=1.2))

ax.set_xlim(-0.8, 6.8)
ax.set_ylim(-1.1, 6.8)
ax.set_aspect('equal')
ax.axis('off')

plt.tight_layout()
output_veleiro = "/home/magdalena/eee/alunos/47356812742818-maximo/plano_velico_saveiro_5_80m.png"
plt.savefig(output_veleiro, dpi=300, bbox_inches='tight')
plt.close()
print("Plano vélico gerado com sucesso!")
