import matplotlib.pyplot as plt
import numpy as np

# Configuração da figura com o padrão visual Brana (Dark Mode Institucional)
plt.style.use('dark_background')
fig, axes = plt.subplots(3, 1, figsize=(14, 11), dpi=200, sharex=True)
fig.patch.set_facecolor('#333333')

# Dimensões do casco do Saveiro Mestre da Cana (escala em metros)
lwl = 13.15 # metros com 15t de carga (33,5t deslocamento total)
x_mid = lwl / 2.0

# Curva esquemática do perfil do casco (quilha e borda)
x_hull = np.linspace(-0.8, lwl + 1.2, 300)
def get_hull_profile(trim_deg=0.0, sinkage=0.0):
    z_keel = 0.05 + 0.75 * ((x_hull - x_mid) / x_mid)**2
    z_sheer = 1.60 + 0.35 * ((x_hull - x_mid) / x_mid)**2
    rad = np.radians(trim_deg)
    z_keel_t = z_keel - sinkage - (x_hull - x_mid) * np.sin(rad)
    z_sheer_t = z_sheer - sinkage - (x_hull - x_mid) * np.sin(rad)
    return z_keel_t, z_sheer_t

# -------------------------------------------------------------
# REGIME 1: BAIXA VELOCIDADE (3,0 nós - SLR = 0,45) - Múltiplas ondas curtas
# -------------------------------------------------------------
ax1 = axes[0]
ax1.set_facecolor('#404040')

x_w = np.linspace(-2, lwl + 3, 500)
wave_1 = 1.20 + 0.08 * np.cos(2 * np.pi * (x_w - lwl) / 2.2) * np.exp(-0.02 * (lwl - x_w))
zk1, zs1 = get_hull_profile(trim_deg=0.0, sinkage=0.0)

ax1.fill_between(x_hull, zk1, zs1, where=(x_hull >= -0.5) & (x_hull <= lwl + 0.8), color='#C59B6D', alpha=0.9, label='Casco do Saveiro (Madeira / EEE)')
ax1.plot(x_hull[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], zs1[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], color='#FFFFFF', linewidth=1.8)
ax1.plot(x_hull[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], zk1[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], color='#8A5A36', linewidth=2.5)

ax1.fill_between(x_w, -0.5, wave_1, color='#2B6CB0', alpha=0.35)
ax1.plot(x_w, wave_1, color='#4A90E2', linewidth=2.5, label='Perfil da Superfície Livre (Ondas Curtas: lambda << LWL)')
ax1.axhline(1.20, color='#888888', linestyle=':', label='Linha d\'Água Carregada (DWL = 1,20m com 15t de carga)')

ax1.set_title('1. BAIXA VELOCIDADE (3,0 nós / SLR = 0,46): Várias ondas curtas ao longo do casco — Trim Nivelado, Resistência Mínima', 
              color='#FFFFFF', fontsize=10.5, fontweight='bold', pad=8)
ax1.set_ylabel('Altura - Z (m)', color='#E8E8E8', fontsize=9)
ax1.set_ylim(-0.2, 2.5)
ax1.grid(True, linestyle='--', alpha=0.25, color='#888888')
ax1.legend(loc='upper right', fontsize=8, facecolor='#2E2E2E', edgecolor='#555555')

# -------------------------------------------------------------
# REGIME 2: VELOCIDADE DE CRUZEIRO ÓTIMA (5,5 nós - SLR = 0,84) - Ponto de Projeto
# -------------------------------------------------------------
ax2 = axes[1]
ax2.set_facecolor('#404040')

wave_2 = 1.20 + 0.17 * np.cos(2 * np.pi * (x_w - lwl) / 8.3)
zk2, zs2 = get_hull_profile(trim_deg=0.5, sinkage=0.03)

ax2.fill_between(x_hull, zk2, zs2, where=(x_hull >= -0.5) & (x_hull <= lwl + 0.8), color='#C59B6D', alpha=0.9)
ax2.plot(x_hull[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], zs2[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], color='#FFFFFF', linewidth=1.8)
ax2.plot(x_hull[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], zk2[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], color='#8A5A36', linewidth=2.5)

ax2.fill_between(x_w, -0.5, wave_2, color='#2B6CB0', alpha=0.35)
ax2.plot(x_w, wave_2, color='#9BD79B', linewidth=2.5, label='Onda de Cruzeiro (Cp ótimo = 0,521 — Mínimo Arrasto de Onda)')
ax2.axhline(1.20, color='#888888', linestyle=':')

ax2.annotate('Crista de Proa Suave\n(Altura < 18 cm)', xy=(lwl, 1.37), xytext=(lwl-2.0, 1.95),
             arrowprops=dict(facecolor='#9BD79B', shrink=0.08, width=1.5, headwidth=6),
             color='#9BD79B', fontweight='bold', fontsize=8.5)

ax2.annotate('Operação no Ponto Doce\n(Potência = 24 kW / 32 HP)', xy=(x_mid, 1.10), xytext=(x_mid-1.8, 0.4),
             arrowprops=dict(facecolor='#FEFCBF', shrink=0.08, width=1.5, headwidth=6),
             color='#FEFCBF', fontweight='bold', fontsize=8.5)

ax2.set_title('2. VELOCIDADE DE CRUZEIRO DO MESTRE DA CANA (5,5 nós / SLR = 0,84): Onda suave e equilibrada — Eficiência Máxima com 15t', 
              color='#9BD79B', fontsize=10.5, fontweight='bold', pad=8)
ax2.set_ylabel('Altura - Z (m)', color='#E8E8E8', fontsize=9)
ax2.set_ylim(-0.2, 2.5)
ax2.grid(True, linestyle='--', alpha=0.25, color='#888888')
ax2.legend(loc='upper right', fontsize=8, facecolor='#2E2E2E', edgecolor='#555555')

# -------------------------------------------------------------
# REGIME 3: VELOCIDADE DE CASCO / BARREIRA (8,80 nós - SLR = 1,34) - O Barco Preso na Onda
# -------------------------------------------------------------
ax3 = axes[2]
ax3.set_facecolor('#404040')

wave_3 = 1.20 + 0.60 * np.cos(2 * np.pi * (x_w - lwl) / lwl)
zk3, zs3 = get_hull_profile(trim_deg=3.0, sinkage=0.20)

ax3.fill_between(x_hull, zk3, zs3, where=(x_hull >= -0.5) & (x_hull <= lwl + 0.8), color='#C59B6D', alpha=0.9)
ax3.plot(x_hull[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], zs3[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], color='#FFFFFF', linewidth=1.8)
ax3.plot(x_hull[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], zk3[(x_hull >= -0.5) & (x_hull <= lwl + 0.8)], color='#8A5A36', linewidth=2.5)

ax3.fill_between(x_w, -0.5, wave_3, color='#9A3231', alpha=0.35)
ax3.plot(x_w, wave_3, color='#EE9A98', linewidth=2.8, label='Onda de Casco (lambda = LWL = 13,15 m — Crista na Proa e na Popa, Cava no Meio)')
ax3.axhline(1.20, color='#888888', linestyle=':')

ax3.annotate('1ª Crista: Proa Empina\n(Sobe na crista)', xy=(lwl, 1.80), xytext=(lwl-2.8, 2.15),
             arrowprops=dict(facecolor='#EE9A98', shrink=0.08, width=1.5, headwidth=6),
             color='#EE9A98', fontweight='bold', fontsize=8.5)

ax3.annotate('Cava da Onda (Depressão Central):\nPerda de sustentação hidrostática', xy=(x_mid, 0.60), xytext=(x_mid-2.2, 0.15),
             arrowprops=dict(facecolor='#FF6B6B', shrink=0.08, width=1.5, headwidth=6),
             color='#FF6B6B', fontweight='bold', fontsize=8.5)

ax3.annotate('2ª Crista: Popa Afunda / Senta\n(Arrasto enorme no espelho)', xy=(0.0, 1.80), xytext=(0.8, 2.15),
             arrowprops=dict(facecolor='#EE9A98', shrink=0.08, width=1.5, headwidth=6),
             color='#EE9A98', fontweight='bold', fontsize=8.5)

ax3.set_title('3. VELOCIDADE DE CASCO / BARREIRA (V_Hull = 8,80 nós / SLR = 1,34): O Saveiro "Preso na Ladeira" da Própria Onda', 
              color='#EE9A98', fontsize=10.5, fontweight='bold', pad=8)
ax3.set_xlabel('Posição Longitudinal ao longo do Casco - X (metros)', color='#E8E8E8', fontsize=9.5)
ax3.set_ylabel('Altura - Z (m)', color='#E8E8E8', fontsize=9)
ax3.set_ylim(-0.2, 2.5)
ax3.set_xlim(-1.5, 15.0)
ax3.grid(True, linestyle='--', alpha=0.25, color='#888888')
ax3.legend(loc='lower left', fontsize=8, facecolor='#2E2E2E', edgecolor='#555555')

plt.suptitle('BRANA / ESTALEIRO ESCOLA EMBRIÃO — FENÔMENO HIDRODINÂMICO DA VELOCIDADE DE CASCO\nDemonstração da Interação Casco-Onda: Saveiro Mestre da Cana (Capacidade: 15 t / Deslocamento: 33,5 t)', 
             color='#EE9A98', fontsize=12.5, fontweight='bold', y=0.985)

plt.tight_layout(rect=[0, 0.02, 1, 0.95])

out_air = '/home/magdalena/eee/alunos/air/demonstracao_visual_velocidade_casco_ondas.png'
out_g3 = '/home/magdalena/eee/grupos/grupo-3/demonstracao_visual_velocidade_casco_ondas.png'

plt.savefig(out_air, facecolor=fig.get_facecolor(), edgecolor='none', dpi=200)
plt.savefig(out_g3, facecolor=fig.get_facecolor(), edgecolor='none', dpi=200)
print('Infográfico de ondas atualizado com sucesso!')
