import json, sys
import numpy as np
import matplotlib; matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.patches import FancyBboxPatch
INK="#14161a"; MUTED="#6b7078"; GRID="#d9d6cf"; OLIVE="#4d6e00"; BLUE="#2f6fb0"; RED="#b5452e"; LIME="#9ccf1f"
plt.rcParams.update({"font.family":"DejaVu Sans","font.size":9.5,"axes.edgecolor":MUTED,"axes.labelcolor":INK,"xtick.color":MUTED,"ytick.color":MUTED,
 "axes.grid":True,"grid.color":GRID,"grid.linewidth":0.6,"axes.spines.top":False,"axes.spines.right":False,"svg.fonttype":"none",
 "figure.facecolor":"none","axes.facecolor":"none"})
OUT=sys.argv[1]
def save(fig,name):
    fig.savefig(f"{OUT}/{name}.svg",bbox_inches="tight"); fig.savefig(f"{OUT}/{name}.png",dpi=150,bbox_inches="tight",facecolor="white")
# ---- Figura 1: o processo e onde a medição entra
fig,ax=plt.subplots(figsize=(10.5,3.1)); ax.set_xlim(0,11.1); ax.set_ylim(-0.3,3); ax.axis("off")
steps=[("Reclamação",""),("Medição\n168 h",""),("Compensação\nmensal",""),("Diagnóstico\ne conserto","A"),("Nova medição\n168 h","B"),("Fim da\ncompensação","")]
x=0.15
for i,(s,tag) in enumerate(steps):
    w=1.45
    box=FancyBboxPatch((x,1.2),w,0.95,boxstyle="round,pad=0.02,rounding_size=0.08",fc="none",ec=INK if not tag else OLIVE,lw=1.6 if tag else 1.0)
    ax.add_patch(box); ax.text(x+w/2,1.675,s,ha="center",va="center",fontsize=9,color=INK)
    if tag: ax.text(x+w/2,2.4,tag,ha="center",fontsize=13,fontweight="bold",color=OLIVE)
    if i<len(steps)-1: ax.annotate("",xy=(x+w+0.33,1.675),xytext=(x+w+0.03,1.675),arrowprops=dict(arrowstyle="-|>",color=MUTED,lw=1))
    x+=w+0.36
ax.text(0.15,0.75,"A — antes do conserto: a causa está na média ou na baixa tensão? Errar aqui leva a consertar no lugar errado.",fontsize=8.6,color=INK)
ax.text(0.15,0.35,"B — depois do conserto: o consumidor já regularizou? Errar aqui gera comprobatória reprovada ou meses a mais de compensação.",fontsize=8.6,color=INK)
ax.text(0.15,-0.05,"A compensação continua sendo paga até a nova medição de 168 h comprovar a regularização.",fontsize=8.3,color=MUTED)
save(fig,"p3_fig1_processo"); plt.close(fig)
# ---- Figura 2: exemplo do regulador travado
r=json.load(open(f"{OUT}/exemplo_regulador.json")); t=np.array(r["t"])/144
fig,axs=plt.subplots(2,1,figsize=(10.5,5.2),sharex=True)
ax=axs[0]; ax.plot(t,r["tap_true"],color=INK,lw=2,label="Verdade (travado)")
ax.plot(t,r["tap"]["0"],color=RED,lw=1.1,label="Estimado sem sensores"); ax.plot(t,r["tap"]["2"],color=BLUE,lw=1.1,label="Estimado com 2 sensores")
ax.set_ylabel("Relação do regulador 2\n(fase a)"); ax.set_ylim(0.95,1.06); ax.legend(frameon=False,fontsize=8,ncol=3,loc="upper left")
ax=axs[1]; ax.axhspan(0.90,0.93,color="#f1d9a8",alpha=0.5,lw=0); ax.axhspan(0.80,0.90,color="#efc2b5",alpha=0.45,lw=0)
ax.plot(t,r["v_true"],color=INK,lw=2,label="Verdade"); ax.plot(t,r["v_est"]["0"],color=RED,lw=1.1,label="Sem sensores"); ax.plot(t,r["v_est"]["2"],color=BLUE,lw=1.1,label="2 sensores")
ax.set_ylabel("Tensão entre fases\nna barra 840 (p.u.)"); ax.set_xlabel("Dia da semana de medição"); ax.set_xlim(0,7)
lo=min(np.nanmin(r["v_true"]),np.nanmin(r["v_est"]["2"]))-0.01; ax.set_ylim(max(0.85,lo),1.06)
ax.text(0.05,0.915,"precária",fontsize=8,color="#8a6a1e",va="center")
save(fig,"p3_fig2_regulador"); plt.close(fig)
print("ok")
