#!/usr/bin/env python3
"""
Figuras del Proyecto de Semana 7 — Electiva en Transformación Digital (NRC-8775)
================================================================================
Genera los cuatro apoyos visuales del documento, a 300 dpi, en ./figuras/

Figura 1. Resultados medidos antes y después de la intervención.
Figura 2. Cumplimiento de plazos procesales, marzo-agosto de 2026.
Figura 3. Arquitectura funcional de la plataforma.
Figura 4. Cronograma del plan de trabajo (septiembre 2026 - agosto 2027).

Las cifras provienen de la medición en producción del caso de referencia y son
las mismas que se citan en el cuerpo del documento.
"""

import os

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch
import numpy as np

# ─── Paleta e identidad visual ────────────────────────────────────────
AZUL = "#1B2A47"
AZUL_CLARO = "#3D5A80"
NARANJA = "#C1651A"
VERDE = "#2E6B4F"
GRIS = "#6B6B6B"
GRIS_SUAVE = "#E4E7EC"

BASE = os.path.dirname(os.path.abspath(__file__))
SALIDA = os.path.join(BASE, "figuras")

plt.rcParams.update({
    "font.family": "sans-serif",
    "font.sans-serif": ["Calibri", "Helvetica Neue", "Arial", "DejaVu Sans"],
    "font.size": 9,
    "axes.edgecolor": GRIS,
    "axes.labelcolor": AZUL,
    "text.color": "#222222",
    "xtick.color": GRIS,
    "ytick.color": GRIS,
    "axes.spines.top": False,
    "axes.spines.right": False,
    "figure.dpi": 300,
    "savefig.dpi": 300,
    "savefig.bbox": "tight",
    "savefig.facecolor": "white",
})


def guardar(fig, nombre):
    ruta = os.path.join(SALIDA, nombre)
    fig.savefig(ruta)
    plt.close(fig)
    print(f"  ✓ {nombre}")
    return ruta


# ─── Figura 1 ─────────────────────────────────────────────────────────

def figura_1_antes_despues():
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9.2, 3.9))

    # Panel A — tiempos de respuesta (escala logarítmica)
    etiquetas_a = ["Consulta de\nanalítica", "Extracción\ndocumental", "Listado de\nclientes"]
    antes_a = [104.0, 30.0, 0.327]
    despues_a = [0.06, 12.0, 0.026]

    y = np.arange(len(etiquetas_a))
    alto = 0.36

    ax1.barh(y + alto / 2, antes_a, alto, label="Antes", color=GRIS_SUAVE,
             edgecolor=GRIS, linewidth=0.6)
    ax1.barh(y - alto / 2, despues_a, alto, label="Después", color=AZUL_CLARO,
             edgecolor=AZUL, linewidth=0.6)

    ax1.set_xscale("log")
    ax1.set_yticks(y)
    ax1.set_yticklabels(etiquetas_a)
    ax1.set_xlabel("Segundos (escala logarítmica)")
    ax1.set_title("A. Tiempo de respuesta", fontsize=10, color=AZUL,
                  fontweight="bold", loc="left", pad=10)
    ax1.legend(frameon=False, fontsize=8, loc="lower right")
    ax1.set_xlim(0.01, 700)
    ax1.invert_yaxis()

    for i, (a, d) in enumerate(zip(antes_a, despues_a)):
        ax1.text(a * 1.25, i + alto / 2, f"{a:g} s", va="center", fontsize=7.5, color=GRIS)
        ax1.text(d * 1.25, i - alto / 2, f"{d:g} s", va="center", fontsize=7.5,
                 color=AZUL, fontweight="bold")

    # Panel B — volumen mensual procesado
    etiquetas_b = ["Expedientes bajo\nvigilancia judicial", "Actuaciones\ndetectadas"]
    antes_b = [13, 401]
    despues_b = [1803, 8576]

    alto_b = 0.26
    y2 = np.arange(len(etiquetas_b)) * 0.58
    ax2.barh(y2 + alto_b / 2, antes_b, alto_b, label="Antes", color=GRIS_SUAVE,
             edgecolor=GRIS, linewidth=0.6)
    ax2.barh(y2 - alto_b / 2, despues_b, alto_b, label="Después", color=NARANJA,
             edgecolor="#8A4712", linewidth=0.6)

    ax2.set_yticks(y2)
    ax2.set_yticklabels(etiquetas_b)
    ax2.set_xlabel("Registros por mes")
    ax2.set_title("B. Volumen mensual procesado", fontsize=10, color=AZUL,
                  fontweight="bold", loc="left", pad=10)
    ax2.legend(frameon=False, fontsize=8, loc="lower right")
    ax2.set_xlim(0, 10800)
    ax2.set_ylim(-0.46, 1.04)
    ax2.invert_yaxis()

    for i, (a, d) in enumerate(zip(antes_b, despues_b)):
        ax2.text(a + 190, y2[i] + alto_b / 2, f"{a:,}".replace(",", "."), va="center",
                 fontsize=7.5, color=GRIS)
        ax2.text(d + 190, y2[i] - alto_b / 2, f"{d:,}".replace(",", "."), va="center",
                 fontsize=7.5, color="#8A4712", fontweight="bold")

    fig.tight_layout()
    return guardar(fig, "figura_1_antes_despues.png")


# ─── Figura 2 ─────────────────────────────────────────────────────────

def figura_2_cumplimiento_plazos():
    fig, ax = plt.subplots(figsize=(8.4, 3.6))

    meses = ["Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto*"]
    valores = [21.8, 50.7, 11.6, 50.9, 67.8, 70.9]
    cerradas = [335, 213, 465, 167, 329, 86]

    x = np.arange(len(meses))

    ax.axvspan(3.5, 5.5, color="#F3F6FA", zorder=0)

    ax.plot(x, valores, marker="o", markersize=6, linewidth=2.2, color=AZUL,
            markerfacecolor="white", markeredgewidth=1.8, zorder=3)

    for i, (v, c) in enumerate(zip(valores, cerradas)):
        ax.annotate(f"{v} %".replace(".", ","), (i, v),
                    textcoords="offset points",
                    xytext=(0, 12), ha="center", fontsize=8.5,
                    fontweight="bold", color=AZUL)
        ax.text(i, 3.2, f"n = {c}", ha="center", fontsize=7, color=GRIS)

    ax.annotate("Entrada en operación del\nprotocolo de tiempos de respuesta",
                xy=(4, 67.8), xytext=(2.05, 79),
                fontsize=7.8, color=VERDE, ha="center",
                arrowprops=dict(arrowstyle="->", color=VERDE, lw=1.1,
                                connectionstyle="arc3,rad=-0.2"))

    ax.set_xticks(x)
    ax.set_xticklabels(meses)
    ax.set_ylabel("Solicitudes cerradas dentro del plazo (%)")
    ax.set_ylim(0, 92)
    ax.grid(axis="y", linestyle=":", linewidth=0.6, color=GRIS_SUAVE, zorder=0)
    ax.set_axisbelow(True)

    fig.tight_layout()
    return guardar(fig, "figura_2_cumplimiento_plazos.png")


# ─── Figura 3 ─────────────────────────────────────────────────────────

def _caja(ax, x, y, ancho, alto, texto, color_fondo, color_texto="white",
          tam=8.2, negrita=False):
    caja = FancyBboxPatch((x, y), ancho, alto,
                          boxstyle="round,pad=0.012,rounding_size=0.035",
                          facecolor=color_fondo, edgecolor="none", zorder=2)
    ax.add_patch(caja)
    ax.text(x + ancho / 2, y + alto / 2, texto, ha="center", va="center",
            fontsize=tam, color=color_texto, zorder=3,
            fontweight="bold" if negrita else "normal", linespacing=1.35)


def figura_3_arquitectura():
    fig, ax = plt.subplots(figsize=(9.0, 5.0))
    ax.set_xlim(0, 10)
    ax.set_ylim(0.55, 7.05)
    ax.axis("off")

    capas = [
        (5.55, "Capa de\nexperiencia", AZUL,
         ["Portal web\nresponsivo", "Tableros de\ncontrol", "Asistente\nconversacional",
          "Informes\nautomáticos"]),
        (4.35, "Capa de\nnegocio", AZUL_CLARO,
         ["Expedientes y\nactuaciones", "Vigilancia\njudicial", "Calidad y\ncumplimiento",
          "Alertas de\ntérminos"]),
        (3.15, "Capa de\ninteligencia\nartificial", NARANJA,
         ["Extracción\ndocumental", "Cascada de\nmodelos", "Analítica\npredictiva",
          "Búsqueda\nnormativa"]),
        (1.95, "Capa de\ndatos", VERDE,
         ["Base\ntransaccional", "Tablas\nanalíticas", "Trazabilidad\ndel origen",
          "Auditoría de\ncambios"]),
        (0.75, "Capa de\nintegración", GRIS,
         ["Fuentes\njudiciales", "Verificación\nde identidad", "Firma\nelectrónica",
          "Correo y\nmensajería"]),
    ]

    x0, ancho, hueco = 2.30, 1.83, 0.12
    for y, titulo, color, bloques in capas:
        ax.text(0.05, y + 0.42, titulo, fontsize=9.2, color=color,
                fontweight="bold", va="center", linespacing=1.3)
        for i, texto in enumerate(bloques):
            _caja(ax, x0 + i * (ancho + hueco), y, ancho, 0.84, texto, color)

    centro = x0 + 1.5 * ancho + hueco
    for y in [1.72, 2.92, 4.12, 5.32]:
        ax.add_patch(FancyArrowPatch((centro, y - 0.10), (centro, y + 0.19),
                                     arrowstyle="-|>", mutation_scale=11,
                                     color=GRIS, lw=1.0, zorder=1))

    ax.text(centro, 6.78, "Infraestructura en la nube · despliegue continuo · multiempresa",
            ha="center", fontsize=8.6, color=GRIS, style="italic")

    fig.tight_layout()
    return guardar(fig, "figura_3_arquitectura.png")


# ─── Figura 4 ─────────────────────────────────────────────────────────

def figura_4_cronograma():
    fig, ax = plt.subplots(figsize=(9.2, 4.6))

    # (etiqueta, mes de inicio 0-based desde sep-2026, duración en meses, responsable)
    tareas = [
        ("F1. Validación de mercado y producto mínimo", 0, 2, "MFRP"),
        ("F2. Modelo de negocio y estructura de precios", 1, 2, "MFRP"),
        ("F3. Arquitectura multiempresa y migración", 2, 4, "AOF"),
        ("F4. Motor de IA y gobierno del dato", 4, 4, "AOF"),
        ("F5. Piloto con firmas ancla", 6, 3, "AMB"),
        ("F6. Cumplimiento normativo y seguridad", 7, 3, "AOF"),
        ("F7. Lanzamiento comercial", 9, 3, "MFRP"),
        ("F8. Operación, soporte y medición", 10, 2, "AMB"),
    ]

    colores = {"AOF": AZUL, "MFRP": NARANJA, "AMB": VERDE}
    nombres = {
        "AOF": "Alexander Oviedo Fadul",
        "MFRP": "Maria Fernanda Ruiz Paipilla",
        "AMB": "Responsabilidad compartida",
    }

    for i, (etiqueta, inicio, duracion, resp) in enumerate(tareas):
        y = len(tareas) - i - 1
        ax.barh(y, duracion, left=inicio, height=0.52,
                color=colores[resp], edgecolor="none", zorder=3)
        ax.text(inicio + duracion + 0.15, y, resp, va="center",
                fontsize=7.6, color=colores[resp], fontweight="bold")

    ax.set_yticks(range(len(tareas)))
    ax.set_yticklabels([t[0] for t in reversed(tareas)], fontsize=8.4)

    meses = ["Sep", "Oct", "Nov", "Dic", "Ene", "Feb", "Mar", "Abr",
             "May", "Jun", "Jul", "Ago"]
    ax.set_xticks(np.arange(12) + 0.5)
    ax.set_xticklabels(meses, fontsize=8)
    ax.set_xlim(0, 13.1)
    ax.set_ylim(-0.6, len(tareas) + 0.15)

    for x in range(13):
        ax.axvline(x, color=GRIS_SUAVE, linewidth=0.6, zorder=0)
    ax.axvline(4, color=GRIS, linewidth=1.0, linestyle="--", zorder=1)

    ax.text(2.0, len(tareas) - 0.22, "2026", ha="center", fontsize=8,
            color=GRIS, fontweight="bold")
    ax.text(8.5, len(tareas) - 0.22, "2027", ha="center", fontsize=8,
            color=GRIS, fontweight="bold")

    manijas = [plt.Rectangle((0, 0), 1, 1, color=colores[k]) for k in
               ["AOF", "MFRP", "AMB"]]
    ax.legend(manijas, [nombres[k] for k in ["AOF", "MFRP", "AMB"]],
              frameon=False, fontsize=7.8, loc="lower right",
              bbox_to_anchor=(1.0, -0.24), ncol=3)

    ax.spines["left"].set_visible(False)
    ax.tick_params(axis="y", length=0)

    fig.tight_layout()
    return guardar(fig, "figura_4_cronograma.png")


def main():
    os.makedirs(SALIDA, exist_ok=True)
    print("Generando figuras…")
    figura_1_antes_despues()
    figura_2_cumplimiento_plazos()
    figura_3_arquitectura()
    figura_4_cronograma()
    print(f"\nFiguras en: {SALIDA}")


if __name__ == "__main__":
    main()
