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

pdf_path = "/home/magdalena/eee/alunos/caliandra/Esboco_Arranjo_Geral_Caliandra.pdf"

fig = plt.figure(figsize=(16.54, 11.69), dpi=300)
plt.subplots_adjust(left=0.04, right=0.96, top=0.93, bottom=0.06)

fig.suptitle("ESBOÇO DE ARRANJO GERAL PRELIMINAR (21 BALIZAS)", fontsize=15, fontweight="bold", y=0.97, color="#1F2429")
fig.text(0.5, 0.942, "Lancha de Resgate Rápido SAR 9.0m — O RESGATE | 20 Intervalos (ΔX = 450 mm) | Projetista: Caliandra | Escala 1:25", 
         ha="center", fontsize=9.5, color="#5A626B", fontstyle="italic")

ax_prof = plt.subplot2grid((2, 1), (0, 0))
ax_plan = plt.subplot2grid((2, 1), (1, 0), sharex=ax_prof)

C_HULL = "#2E6B72"
C_CABIN = "#D97706"
C_COLLAR = "#1F2429"
C_DECK = "#EFF2F3"
C_SEAT = "#C4262E"
C_GLASS = "#93C5FD"
C_WL = "#0284C7"

stn_x = np.linspace(0, 9.0, 21)

# 1. PROFILE VIEW
ax_prof.set_title("1. ELEVAÇÃO LONGITUDINAL / PERFIL (INBOARD PROFILE — 21 BALIZAS)", fontsize=11, fontweight="bold", color="#C4262E", loc="left", pad=5)
ax_prof.axhline(0.52, color=C_WL, lw=1.2, ls="-.", zorder=1)
ax_prof.text(0.1, 0.55, "DWL = 0.52 m (Linha d'Água de Projeto)", color=C_WL, fontsize=7.5, fontweight="bold")

x_hull = [0, 4.5, 6.75, 8.55, 9.0]
z_keel = [0.0, 0.0, 0.27, 0.89, 1.10]
z_sheer = [1.10, 1.10, 1.18, 1.35, 1.40]

ax_prof.plot([0, 0], [0.0, 1.10], color=C_HULL, lw=2.5)
ax_prof.plot(x_hull, z_keel, color=C_HULL, lw=2.5)
ax_prof.plot(x_hull, z_sheer, color=C_HULL, lw=2.5)
ax_prof.fill_between(x_hull, z_keel, z_sheer, color="#F8FAFC", zorder=0)

for x_c, z_c in zip(np.linspace(0.1, 8.9, 36), np.interp(np.linspace(0.1, 8.9, 36), x_hull, z_sheer)):
    circ = patches.Circle((x_c, z_c), 0.08, facecolor=C_COLLAR, edgecolor="#475569", lw=0.4, zorder=4)
    ax_prof.add_patch(circ)

ax_prof.plot([0.1, 6.0], [0.55, 0.55], color="#64748B", lw=1.5, ls="--")
ax_prof.plot([6.0, 8.8], [0.70, 0.70], color="#64748B", lw=1.5, ls="--")
ax_prof.text(1.2, 0.40, "Piso Autovaziante (Z=0.55m)", color="#64748B", fontsize=7)

rect_tank = patches.Rectangle((1.8, 0.10), 2.0, 0.38, facecolor="#FDE047", edgecolor="#CA8A04", lw=1.2, hatch="//", zorder=2)
ax_prof.add_patch(rect_tank)
ax_prof.text(2.8, 0.28, "Tanques Combustível\n(2x 250L = 500L)", color="#854D0E", fontsize=7, fontweight="bold", ha="center", va="center")

ax_prof.axvline(1.80, ymin=0.15, ymax=0.50, color="#C4262E", lw=1.5, ls=":") # B4
ax_prof.axvline(4.50, ymin=0.15, ymax=0.50, color="#C4262E", lw=1.5, ls=":") # B10 (Meia-Nau)
ax_prof.axvline(7.20, ymin=0.20, ymax=0.65, color="#C4262E", lw=1.8, ls=":") # B16 (Antepara)
ax_prof.text(7.25, 0.85, "Antepara Colisão\n(B16 - Estanque)", color="#C4262E", fontsize=7, fontweight="bold")

cab_x = [3.2, 3.2, 5.8, 6.4, 6.2, 3.2]
cab_z = [1.10, 2.25, 2.28, 1.80, 1.15, 1.10]
ax_prof.plot(cab_x, cab_z, color="#B45309", lw=2, zorder=5)
ax_prof.fill(cab_x, cab_z, color="#FEF3C7", alpha=0.6, zorder=3)

win_x = [3.6, 5.6, 6.1, 5.7, 3.6]
win_z = [1.60, 1.60, 1.80, 2.15, 2.15]
ax_prof.fill(win_x, win_z, color=C_GLASS, alpha=0.7, edgecolor="#0284C7", lw=1.2, zorder=6)
ax_prof.text(4.8, 1.85, "Cabine Fechada (Compósito)\nVisibilidade 360°", color="#0369A1", fontsize=7.5, fontweight="bold", ha="center")

# Radar Arch
ax_prof.plot([4.4, 4.5, 4.6], [2.28, 2.75, 2.28], color="#475569", lw=2, zorder=7)
radome = patches.Ellipse((4.5, 2.82), 0.50, 0.16, facecolor="white", edgecolor="#1E293B", lw=1.2, zorder=8)
ax_prof.add_patch(radome)
ax_prof.text(4.5, 2.82, "RADAR", fontsize=6, fontweight="bold", ha="center", va="center")
flasher = patches.Rectangle((4.42, 2.92), 0.16, 0.12, facecolor="#EF4444", edgecolor="#991B1B", lw=1, zorder=8)
ax_prof.add_patch(flasher)
ax_prof.plot([4.3, 4.3], [2.75, 3.40], color="#1E293B", lw=1.5, zorder=7)
ax_prof.plot([4.7, 4.7], [2.75, 3.35], color="#1E293B", lw=1.5, zorder=7)

for sx in [3.8, 5.0]:
    ax_prof.plot([sx, sx], [0.55, 0.95], color="#1E293B", lw=2, zorder=6)
    seat_c = patches.Rectangle((sx-0.18, 0.95), 0.36, 0.10, facecolor=C_SEAT, edgecolor="#991B1B", lw=1, zorder=7)
    seat_b = patches.Rectangle((sx-0.18, 1.05), 0.10, 0.40, facecolor=C_SEAT, edgecolor="#991B1B", lw=1, zorder=7)
    ax_prof.add_patch(seat_c)
    ax_prof.add_patch(seat_b)
ax_prof.text(4.4, 0.70, "4x Assentos Amortecidos", color="#991B1B", fontsize=7, fontweight="bold", ha="center")

motor_poly = patches.Polygon([(-0.6, 0.55), (-0.1, 0.55), (-0.05, 1.20), (-0.55, 1.25)], facecolor="#1F2429", edgecolor="#0F172A", lw=1.2, zorder=5)
ax_prof.add_patch(motor_poly)
ax_prof.plot([-0.30, -0.30], [0.55, -0.20], color="#334155", lw=3.5, zorder=4)
ax_prof.plot([-0.25, -0.25], [-0.20, -0.20], marker="8", markersize=8, color="#94A3B8", zorder=5)
ax_prof.text(-0.35, 0.90, "2x 300 HP\n(Gasolina)", color="white", fontsize=6.5, fontweight="bold", ha="center", va="center", zorder=6)

for stn_i, x_val in enumerate(stn_x):
    ax_prof.axvline(x_val, color="#CBD5E1", lw=0.4, ls=":", zorder=1)
    ax_prof.text(x_val, -0.25, f"B{stn_i}", ha="center", fontsize=5.5, color="#64748B")

ax_prof.set_ylabel("Altura Z (m)", fontsize=8.5, fontweight="bold")
ax_prof.set_xlim(-1.0, 9.6)
ax_prof.set_ylim(-0.35, 3.6)
ax_prof.grid(True, linestyle=":", alpha=0.5)

# 2. PLAN VIEW
ax_plan.set_title("2. PLANTA DE CONVÉS E DISPOSIÇÃO INTERNA (DECK PLAN — 21 BALIZAS)", fontsize=11, fontweight="bold", color="#C4262E", loc="left", pad=5)
px = [0, 4.5, 6.30, 7.20, 8.55, 9.0, 8.55, 7.20, 6.30, 4.5, 0, 0]
py = [-1.50, -1.50, -1.18, -0.87, -0.25, 0.0, 0.25, 0.87, 1.18, 1.50, 1.50, -1.50]
ax_plan.plot(px, py, color=C_HULL, lw=2.5)
ax_plan.fill(px, py, color="#F1F5F9", zorder=0)

for i in range(len(px)-1):
    x_seg = np.linspace(px[i], px[i+1], max(2, int(np.hypot(px[i+1]-px[i], py[i+1]-py[i])*5)))
    y_seg = np.linspace(py[i], py[i+1], max(2, int(np.hypot(px[i+1]-px[i], py[i+1]-py[i])*5)))
    for xc, yc in zip(x_seg, y_seg):
        circ = patches.Circle((xc, yc), 0.08, facecolor=C_COLLAR, edgecolor="#475569", lw=0.4, zorder=3)
        ax_plan.add_patch(circ)

ax_plan.axhline(0, color="#94A3B8", lw=1.2, ls="-.", zorder=1)

cab_rect = patches.FancyBboxPatch((3.2, -1.10), 3.0, 2.20, boxstyle="round,pad=0.08,rounding_size=0.25", 
                                  facecolor="#FEF3C7", edgecolor="#B45309", lw=2, zorder=4)
ax_plan.add_patch(cab_rect)
ax_plan.plot([5.9, 6.2, 5.9], [-1.0, 0.0, 1.0], color=C_GLASS, lw=2.5, zorder=5)

seat_positions = [
    (5.1, -0.60, "Piloto\n(Comandante)"),
    (5.1, 0.60, "Navegador\n(Comunicações)"),
    (3.9, -0.60, "Socorrista 1\n(Mergulhador)"),
    (3.9, 0.60, "Socorrista 2\n(APH / Maca)")
]
for sx, sy, slabel in seat_positions:
    s_patch = patches.Rectangle((sx-0.25, sy-0.25), 0.50, 0.50, facecolor=C_SEAT, edgecolor="#991B1B", lw=1.2, zorder=6)
    ax_plan.add_patch(s_patch)
    ax_plan.text(sx, sy, slabel, color="white", fontsize=5.5, fontweight="bold", ha="center", va="center", zorder=7)

stretcher = patches.Rectangle((3.6, -0.22), 1.9, 0.44, facecolor="#E0E7FF", edgecolor="#4F46E5", lw=1.2, ls="--", zorder=5)
ax_plan.add_patch(stretcher)
ax_plan.text(4.55, 0.0, "Maca Rígida / APH", color="#3730A3", fontsize=6, fontweight="bold", ha="center", va="center", zorder=6)

ax_plan.text(1.8, 0.0, "PRAÇA DE POPA / ÁREA DE RESGATE\n(Convés Livre, Autovaziante, Não-Derrapante)", 
             color="#1E293B", fontsize=7.5, fontweight="bold", ha="center", va="center")

bracket = patches.Rectangle((-0.4, -0.9), 0.4, 1.8, facecolor="#CBD5E1", edgecolor="#64748B", lw=1.2, zorder=3)
ax_plan.add_patch(bracket)
m1 = patches.Rectangle((-0.65, -0.75), 0.55, 0.40, facecolor="#1F2429", edgecolor="#0F172A", lw=1.2, zorder=5)
m2 = patches.Rectangle((-0.65, 0.35), 0.55, 0.40, facecolor="#1F2429", edgecolor="#0F172A", lw=1.2, zorder=5)
ax_plan.add_patch(m1)
ax_plan.add_patch(m2)
ax_plan.text(-0.37, -0.55, "300 HP\n(BE)", color="white", fontsize=6, fontweight="bold", ha="center", va="center", zorder=6)
ax_plan.text(-0.37, 0.55, "300 HP\n(BB)", color="white", fontsize=6, fontweight="bold", ha="center", va="center", zorder=6)

winch = patches.Circle((7.8, 0.0), 0.18, facecolor="#64748B", edgecolor="#334155", lw=1.2, zorder=5)
ax_plan.add_patch(winch)
ax_plan.text(7.8, -0.32, "Paiol de Amarra\n(B17)", color="#475569", fontsize=6, fontweight="bold", ha="center")

for stn_i, x_val in enumerate(stn_x):
    ax_plan.axvline(x_val, color="#CBD5E1", lw=0.4, ls=":", zorder=1)
    ax_plan.text(x_val, -1.65, f"B{stn_i}", ha="center", fontsize=5.5, color="#64748B")

ax_plan.set_xlabel("Comprimento Longitudinal X (m) [20 intervalos espaçados a cada 450 mm]", fontsize=8.5, fontweight="bold")
ax_plan.set_ylabel("Meia-Boca Y (m)", fontsize=8.5, fontweight="bold")
ax_plan.set_xlim(-1.0, 9.6)
ax_plan.set_ylim(-2.1, 2.1)
ax_plan.grid(True, linestyle=":", alpha=0.5)

fig.text(0.04, 0.02, "BRANA · Escola de Arquitetura e Engenharia Naval | Estaleiro Escola Embrião — Salvador, BA", fontsize=7.5, color="#5A626B")
fig.text(0.96, 0.02, "Prancha de Arranjo Geral Preliminar — 21 Balizas — Padrão Naval SI", fontsize=7.5, color="#5A626B", ha="right")

plt.savefig(pdf_path, format="pdf", dpi=300)
plt.close()
print("PDF do Arranjo Geral com 21 balizas gerado com sucesso!")
