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

# Configurar prancha técnica estilo CAD Naval
plt.style.use('seaborn-v0_8-whitegrid' if 'seaborn-v0_8-whitegrid' in plt.style.available else 'default')
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(18, 14), dpi=300)

c_hull = '#0F172A'       # Contorno do casco
c_bulkhead = '#1E293B'   # Antepara estrutural
c_cushion = '#E2E8F0'    # Estofamento
c_deck = '#F8FAFC'       # Convés branco
c_glass = '#38BDF8'      # Vidro azul
c_engine = '#334155'     # Motor de popa escuro
c_chine = '#2563EB'      # Chine
c_wood = '#B45309'       # Detalhes em madeira/teca
c_wl = '#0284C7'         # Linha d'Água (WL)
c_dim = '#DC2626'        # Cotas vermelhas

# =========================================================================
# 1. PERFIL LATERAL IDÊNTICO À IMAGEM (DOWNEAST / LOBSTER POCKET CRUISER 8,50 m)
# =========================================================================
ax1.set_title("1. PERFIL LATERAL TÉCNICO (ELEVATION VIEW) — DOWNEAST PILOTHOUSE CRUISER 8,50 m (28 ft)\nCasaria Fechada com Beiral, Vigias na Cabine de Proa, Praça de Popa Baixa e Motor de Popa no Espelho", fontsize=10.5, fontweight='bold', color='#0F172A', pad=10)

xs = np.linspace(0, 8.50, 160)
# Sheerline clássica: popa em +0,75 m, curva suave caindo a meia-nau (+0,70 m) e subindo para proa lançada (+1,35 m)
sheer = 0.75 - 0.05 * np.sin(np.pi * xs / 4.5) + 0.60 * (xs / 8.50)**2.4

# Linha de Fundo / Quilha com Hard Chine
# Popa x=0 (fundo a -0,35 m), meia-nau x=4.5 m (fundo a -0,48 m), roda de proa x=8.50 m (sobe até +1,35 m)
keel_line_x = [0, 0, 1.5, 4.5, 6.8, 8.2, 8.50]
keel_line_y = [0.75, -0.35, -0.42, -0.48, -0.35, 0.20, 1.35]

# Costado Branco Naval (Obra Morta)
poly_hull_x = np.concatenate([xs, [8.50, 8.2, 6.8, 4.5, 1.5, 0, 0]])
poly_hull_y = np.concatenate([sheer, [1.35, 0.20, -0.35, -0.48, -0.42, -0.35, 0.75]])
ax1.fill(poly_hull_x, poly_hull_y, color='#F8FAFC', edgecolor=c_hull, lw=2.2, label="Costado em PRFV Branco")

# Linha de Chine (Aresta Viva) bem marcada (como na imagem)
chine_x = np.linspace(0, 7.8, 100)
chine_y = -0.15 + 0.35 * (chine_x / 7.8)**2.0
ax1.plot(chine_x, chine_y, color=c_chine, lw=1.8, label="Linha de Chine (Hard Chine)")

# Fundo / Obra Viva (Vermelho Vivo ou Azul Escuro abaixo da WL = 0)
x_bot = [0, 0, 1.5, 4.5, 6.8, 7.95, 0]
y_bot = [0, -0.35, -0.42, -0.48, -0.35, 0, 0]
ax1.fill(x_bot, y_bot, color='#B91C1C', edgecolor='black', lw=1.2, label="Fundo / Obra Viva (-0,48 m)")
ax1.axhline(0, color=c_wl, lw=1.8, linestyle='--', label="Linha d'Água (WL = 0,00 m)")

# -------------------------------------------------------------------------
# CASARIA (PILOTHOUSE + CABINE DE PROA COM DEGRAU)
# -------------------------------------------------------------------------
# 1. Cabine de Proa (Trunk Cabin com perfil rebaixado): x = 5.20 a 7.20 m
trunk_x = [5.20, 5.20, 7.20, 7.20]
trunk_y = [np.interp(5.20, xs, sheer), 1.25, 1.32, np.interp(7.20, xs, sheer)]
ax1.fill(trunk_x, trunk_y, color='#F1F5F9', edgecolor=c_hull, lw=1.5)

# Vigias ovais na cabine de proa (exatamente duas como na imagem)
ax1.add_patch(patches.Ellipse((5.80, 1.15), 0.32, 0.16, facecolor=c_glass, edgecolor='black', lw=1.0))
ax1.add_patch(patches.Ellipse((6.50, 1.22), 0.32, 0.16, facecolor=c_glass, edgecolor='black', lw=1.0))

# 2. Casaria Principal (Pilothouse fechada): x = 2.60 a 5.20 m
# Perfil com para-brisa frontal e teto em balanço (overhang)
cab_x = [2.60, 2.60, 2.80, 5.30, 5.45, 5.20]
cab_y = [np.interp(2.60, xs, sheer), 1.95, 2.05, 2.05, 1.95, 1.25]
ax1.fill(cab_x, cab_y, color='#F8FAFC', edgecolor=c_hull, lw=2.0)

# Teto rígido com beiral saliente (Overhang na proa e na ré)
ax1.plot([2.45, 5.40], [2.05, 2.05], color=c_hull, lw=3.5, label="Teto Hardtop c/ Beiral")

# Janelas da Pilothouse (Para-brisa e ampla janela lateral dividida)
# Janela lateral dividida em 2 panos
ax1.add_patch(patches.Polygon([[2.85, 1.35], [3.90, 1.35], [3.90, 1.88], [2.85, 1.88]], closed=True, facecolor=c_glass, edgecolor='black', lw=1.0))
ax1.add_patch(patches.Polygon([[4.00, 1.35], [5.05, 1.35], [4.90, 1.88], [4.00, 1.88]], closed=True, facecolor=c_glass, edgecolor='black', lw=1.0))
# Para-brisa frontal inclinado
ax1.add_patch(patches.Polygon([[5.05, 1.35], [5.25, 1.35], [5.10, 1.88], [4.90, 1.88]], closed=True, facecolor=c_glass, edgecolor='black', lw=1.0))

# Mastrozinho de luzes de navegação no teto
ax1.plot([3.80, 3.80], [2.05, 2.50], color=c_hull, lw=2.0)
ax1.add_patch(patches.Circle((3.80, 2.52), 0.05, facecolor='#FBBF24', edgecolor='black'))

# Borda falsa / Trincheira na praça de popa (Cockpit Coaming)
ax1.plot([0, 2.60], [0.75, np.interp(2.60, xs, sheer)], color=c_wood, lw=3.0, label="Borda Ergonômica de Popa (0,75 m)")

# Guarda-mancebo de proa em inox
ax1.plot([5.20, 8.40, 8.40], [1.10, 1.35, 1.85], color='#94A3B8', lw=1.8)
ax1.plot([5.20, 8.40], [1.70, 1.85], color='#94A3B8', lw=1.8)
for stx in [6.20, 7.30]:
    ax1.plot([stx, stx], [np.interp(stx, xs, sheer), np.interp(stx, xs, sheer) + 0.55], color='#94A3B8', lw=1.2)

# -------------------------------------------------------------------------
# MOTOR DE POPA NO ESPELHO (OUTBOARD MOTOR — Como na imagem)
# -------------------------------------------------------------------------
# Suporte do motor no espelho de popa (x = -0.30 a 0.0 m)
ax1.add_patch(patches.Rectangle((-0.45, 0.15), 0.45, 0.85, facecolor=c_engine, edgecolor='black', lw=1.5))
# Capô arredondado do motor de popa (115 a 150 HP)
ax1.add_patch(patches.Polygon([[-0.45, 0.70], [-0.55, 0.95], [-0.35, 1.05], [-0.10, 1.00], [0.0, 0.70]], closed=True, facecolor=c_engine, edgecolor='black', lw=1.2))
# Rabeta longa descendo na água
ax1.plot([-0.22, -0.22], [0.15, -0.45], color=c_engine, lw=4.5)
# Hélice e placa anticavitação
ax1.add_patch(patches.Polygon([[-0.45, -0.45], [-0.10, -0.45], [-0.27, -0.60]], closed=True, facecolor='#F59E0B'))
ax1.plot([-0.35, -0.10], [-0.35, -0.35], color='black', lw=2.5) # Placa anticavitação
ax1.text(-0.60, 0.55, "Motor de Popa\n(90 a 150 HP)", ha='right', va='center', fontsize=7.2, fontweight='bold', color=c_engine)

# Cotas
ax1.annotate('', xy=(0, -1.00), xytext=(8.50, -1.00), arrowprops=dict(arrowstyle='<->', color=c_dim, lw=1.5))
ax1.text(4.25, -1.18, "Comprimento Total do Casco (LOA) = 8,50 m (28 pés)", ha='center', va='top', fontsize=8.5, fontweight='bold', color=c_dim)

ax1.annotate('', xy=(8.70, 0), xytext=(8.70, 1.35), arrowprops=dict(arrowstyle='<->', color=c_dim, lw=1.2))
ax1.text(8.85, 0.65, "Proa Lançada\n(+1,35 m)", ha='left', va='center', fontsize=7.5, fontweight='bold', color=c_dim)

ax1.set_xlim(-1.2, 10.0)
ax1.set_ylim(-1.4, 2.9)
ax1.set_aspect('equal')
ax1.axis('off')
ax1.legend(loc='upper right', fontsize=7.2)

# =========================================================================
# 2. PLANTA BAIXA SINCRONIZADA COM O PERFIL (ACORDO PERFEITO)
# =========================================================================
ax2.set_title("2. PLANTA BAIXA DE CONVÉS SINCRONIZADA (TOP VIEW — MESMA ESCALA LONGITUDINAL)\nPraça de Popa, Salão Fechado c/ Posto de Comando à Ré do Para-brisa, Banheiro e Cama em V", fontsize=10.5, fontweight='bold', color='#0F172A', pad=10)

w_half = np.where(xs < 4.8, 1.25 + 0.20 * (xs / 4.8)**1.3, 1.45 * np.sqrt(np.maximum(0, 1 - ((xs - 4.8) / 3.7)**2)))
ax2.plot(xs, w_half, color=c_hull, lw=2.2)
ax2.plot(xs, -w_half, color=c_hull, lw=2.2)
ax2.plot([0, 0], [-1.25, 1.25], color=c_hull, lw=2.2)
ax2.fill_between(xs, -w_half, w_half, color='#FFFFFF')
ax2.axhline(0, color='#94A3B8', lw=0.8, linestyle=':')

# Cockpit de Popa (x = 0 a 2.60 m) em Teca
ax2.fill_between(xs[xs <= 2.60], -w_half[xs <= 2.60] + 0.15, w_half[xs <= 2.60] - 0.15, color='#F5E6CA', edgecolor='#D97706', lw=1.0)
ax2.text(1.30, 0, "PRAÇA DE POPA (COCKPIT)\nLivre para Pesca e Convivência", ha='center', va='center', fontsize=7.5, fontweight='bold', color='#78350F')

# Antepara do Salão (x = 2.60 m) com porta
ax2.plot([2.60, 2.60], [-w_half[int(2.60/8.5*160)], -0.35], color=c_bulkhead, lw=2.5)
ax2.plot([2.60, 2.60], [0.35, w_half[int(2.60/8.5*160)]], color=c_bulkhead, lw=2.5)

# Salão (x = 2.60 a 5.20 m): Dinete a Bombordo e Cozinha/Comando a Boreste
# Dinete (Bombordo)
ax2.add_patch(patches.Rectangle((2.70, 0.45), 2.40, 0.90, facecolor=c_cushion, edgecolor='#475569', lw=1.0))
ax2.add_patch(patches.Rectangle((3.30, 0.55), 1.20, 0.70, facecolor=c_wood, edgecolor='#78350F', lw=1.2))
ax2.text(3.90, 0.90, "Mesa Dinete", ha='center', va='center', fontsize=6.5, fontweight='bold', color='white')

# Cozinha e Comando (Boreste)
ax2.add_patch(patches.Rectangle((2.70, -1.35), 1.20, 0.55, facecolor='#CBD5E1', edgecolor='black', lw=0.8))
ax2.text(3.30, -1.05, "Cozinha (Pia+Fogão)", ha='center', fontsize=6.2, fontweight='bold')
ax2.add_patch(patches.Rectangle((4.20, -1.38), 0.90, 0.75, facecolor='#1E293B', edgecolor='black', lw=1.0))
ax2.add_patch(patches.Circle((4.50, -0.95), 0.20, facecolor='none', edgecolor='white', lw=1.5)) # Volante
ax2.text(4.50, -0.55, "Posto de Comando", ha='center', fontsize=6.2, fontweight='bold', color=c_hull)

# Antepara frontal do salão (x = 5.20 m)
ax2.plot([5.20, 5.20], [-w_half[int(5.20/8.5*160)], w_half[int(5.20/8.5*160)]], color=c_bulkhead, lw=2.5)

# Banheiro (x = 5.20 a 6.30 m a Bombordo)
ax2.fill([5.20, 5.20, 6.30, 6.30], [0.40, 1.35, 1.20, 0.40], color=c_glass, alpha=0.4)
ax2.text(5.75, 0.85, "WC / Banheiro", ha='center', fontsize=6.2, fontweight='bold', color='#0369A1')

# Cabine de Proa (x = 6.30 a 8.40 m) com V-Berth
v_pts1 = [[6.30, 0.06], [6.30, 1.20], [8.30, 0.20], [8.30, 0.06]]
v_pts2 = [[6.30, -0.06], [6.30, -1.20], [8.30, -0.20], [8.30, -0.06]]
ax2.add_patch(patches.Polygon(v_pts1, closed=True, facecolor=c_cushion, edgecolor='#475569', lw=1.0))
ax2.add_patch(patches.Polygon(v_pts2, closed=True, facecolor=c_cushion, edgecolor='#475569', lw=1.0))
ax2.text(7.20, 0, "CAMAROTE DE PROA\n(Cama de Casal em V)", ha='center', va='center', fontsize=7.0, fontweight='bold', color='#1E293B')

# Motor de Popa em planta
ax2.add_patch(patches.Rectangle((-0.45, -0.25), 0.45, 0.50, facecolor=c_engine, edgecolor='black', lw=1.2))
ax2.text(-0.55, 0, "Motor de Popa", ha='right', va='center', fontsize=6.8, fontweight='bold', color=c_engine)

# Cotas em planta
ax2.annotate('', xy=(0, -1.80), xytext=(8.50, -1.80), arrowprops=dict(arrowstyle='<->', color=c_dim, lw=1.5))
ax2.text(4.25, -1.98, "LOA = 8,50 m | Boca = 2,90 m | Cockpit = 2,60 m | Salão = 2,60 m | Proa = 3,30 m", ha='center', va='top', fontsize=8.0, fontweight='bold', color=c_dim)

ax2.set_xlim(-1.2, 10.0)
ax2.set_ylim(-2.2, 2.2)
ax2.set_aspect('equal')
ax2.axis('off')

plt.tight_layout()
output_perfil_downeast = "/home/magdalena/eee/alunos/alberico-de-carvalho-santiago/perfil_e_planta_downeast_cruiser_8_5m.png"
plt.savefig(output_perfil_downeast, dpi=300, bbox_inches='tight')
plt.close()
print("Prancha de perfil e planta gerada com sucesso!")
