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

os.makedirs("img", exist_ok=True)

CREAM, INK = "#fcfbf7", "#2f2a24"
MAROON, BLUE, GREEN, AMBER, PURPLE = "#6b1f1f", "#2f5ea8", "#2d6a2d", "#b45309", "#7e22ce"

plt.rcParams.update({
    "figure.facecolor": CREAM, "savefig.facecolor": CREAM, "axes.facecolor": CREAM,
    "axes.edgecolor": INK, "axes.labelcolor": INK, "text.color": INK,
    "xtick.color": INK, "ytick.color": INK, "font.size": 12,
    "axes.grid": True, "grid.alpha": 0.25, "grid.color": INK,
})

H = np.linspace(-np.pi, np.pi, 1201)
TICKS = [-np.pi, -np.pi/2, 0.0, np.pi/2, np.pi]
LABELS = [r"$-\pi$", r"$-\pi/2$", "$0$", r"$\pi/2$", r"$\pi$"]

fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(15.2, 5.0))

for ax in (ax1, ax2, ax3):
    ax.axhline(0.0, color=INK, lw=1.0, alpha=0.5)
    ax.axvline(0.0, color=INK, lw=1.0, alpha=0.5)
    ax.set_xlim(-np.pi, np.pi)
    ax.set_xticks(TICKS)
    ax.set_xticklabels(LABELS)
    ax.set_xlabel("$H$")

# ---- sinh -------------------------------------------------------------
ax1.plot(H, H, ls=(0, (5, 4)), color=INK, lw=1.1, alpha=0.45)
ax1.plot(H, np.sinh(H), color=BLUE, lw=2.4)
ax1.text(2.55, 1.55, "$y = H$", color=INK, alpha=0.6, fontsize=10.5,
         ha="left", va="center")
ax1.plot([0.0], [0.0], "o", color=BLUE, ms=6, zorder=5)
ax1.set_ylim(-12.0, 12.0)
ax1.set_ylabel(r"$\sinh H$")
ax1.set_title(r"$\sinh H = \dfrac{e^{H}-e^{-H}}{2}$", fontsize=13, pad=10)
ax1.text(-2.95, 9.6, "odd, unbounded, $\\sinh H \\approx H$ near $0$\n"
         r"$M_h = e\sinh H - H$", color=BLUE, fontsize=11, ha="left", va="top")

# ---- cosh -------------------------------------------------------------
ax2.axhline(1.0, ls=(0, (5, 4)), color=INK, lw=1.1, alpha=0.5)
ax2.plot(H, np.cosh(H), color=MAROON, lw=2.4)
ax2.plot([0.0], [1.0], "o", color=MAROON, ms=6, zorder=5)
ax2.text(0.30, 2.70, r"$\cosh 0 = 1$", color=MAROON, fontsize=11,
         ha="left", va="bottom")
ax2.set_ylim(0.0, 12.0)
ax2.set_ylabel(r"$\cosh H$")
ax2.set_title(r"$\cosh H = \dfrac{e^{H}+e^{-H}}{2}$", fontsize=13, pad=10)
ax2.text(0.0, 10.9, "even, never below $1$\n"
         r"$r = |a|\left(e\cosh H - 1\right) \geq r_p$",
         color=MAROON, fontsize=11, ha="center", va="top")

# ---- tanh -------------------------------------------------------------
ax3.plot(H, H, ls=(0, (5, 4)), color=INK, lw=1.1, alpha=0.45)
for s in (+1.0, -1.0):
    ax3.axhline(s, ls=(0, (5, 4)), color=GREEN, lw=1.3, alpha=0.8)
ax3.plot(H, np.tanh(H), color=PURPLE, lw=2.4)
ax3.plot([0.0], [0.0], "o", color=PURPLE, ms=6, zorder=5)
ax3.text(np.pi - 0.12, 1.03, "$+1$", color=GREEN, fontsize=11,
         ha="right", va="bottom")
ax3.text(np.pi - 0.12, -1.03, "$-1$", color=GREEN, fontsize=11,
         ha="right", va="top")
ax3.text(1.30, 1.30, "$y = H$", color=INK, alpha=0.6, fontsize=10.5,
         ha="left", va="center")
ax3.set_ylim(-1.5, 1.5)
ax3.set_ylabel(r"$\tanh H$")
ax3.set_title(r"$\tanh H = \dfrac{\sinh H}{\cosh H}$", fontsize=13, pad=10)
ax3.text(-2.95, 0.72, "odd, bounded by $\\pm 1$\n"
         r"$\tanh\frac{H}{2} = \sqrt{\frac{e-1}{e+1}}\,\tan\frac{f}{2}$",
         color=PURPLE, fontsize=11, ha="left", va="top")

plt.tight_layout()
fig.savefig("img/fig-hyperbolic-functions.png", dpi=160, bbox_inches="tight")
plt.close(fig)
