"""Integra las salidas agregadas de R sin publicar microdatos. Ejecutar desde cualquier ruta."""
from pathlib import Path
import json, shutil, argparse
import numpy as np
import pandas as pd
from scipy.stats import t
BASE=Path(__file__).resolve().parent
parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--source',type=Path,default=BASE)
parser.add_argument('--output',type=Path,default=BASE.parents[1]/'dist/pulso-sanitario/tablero/datos')
parser.add_argument('--templates',type=Path)
args=parser.parse_args()
A=args.source;D=args.output;T=args.templates or D
D.mkdir(parents=True,exist_ok=True)
E=pd.read_csv(A/'r_estimaciones.csv')
K=['encuesta','periodo','indicador','nivel','grupo']
assert not E.duplicated(K).any()
lookup=E.set_index(K)
cols=['p','lo','hi','se','deff','n','gl','cv','precision']
counts={}
def get(enc,per,ind,nivel,grupo):
 return lookup.loc[(enc,per,ind,nivel,grupo)]
def period(r,enc):
 if enc=='ENDES 2025':return 'Año 2025'
 if 'periodo' not in r or pd.isna(r.get('periodo')):return 'Semestre 2026' if '2026' in enc else 'Año 2025'
 if r.periodo in ['Año 2025','Semestre 2026']:return r.periodo
 if '2026' in enc:return ('T1' if r.periodo.startswith('I trimestre') else 'T2')+' 2026'
 return f'T{int(r.trimestre)} 2025'
for enc,base in [('ENDES 2025','endes25'),('ENAHO 2025','enaho25'),('ENAHO 2026','enaho26')]:
 for geo in ['region','depto']:
  name=f'{base}_{geo}';d=pd.read_csv(T/(name+'.csv'))
  for i,r in d.iterrows():
   g=r['region' if geo=='region' else 'departamento'];nv='Nacional' if g=='Perú' else ('Región natural' if geo=='region' else 'Departamento')
   out=get(enc,period(r,enc),r.indicador,nv,g)
   for c in cols:d.loc[i,c]=out[c]
  d.to_csv(D/(name+'.csv'),index=False);counts[name]=len(d)
# Solo los dos signos incluidos en la implementación R suministrada.
s=pd.read_csv(T/'endes25_signos.csv');s=s[s.variable.isin(['S481AB','S481AC'])].copy()
for i,r in s.iterrows():
 out=get('ENDES 2025','Año 2025',r.variable,'Nacional','Perú')
 for c in cols:s.loc[i,c]=out[c]
s.to_csv(D/'endes25_signos.csv',index=False)
# La salida R de razones cubre niños; no mezclarla con el comparador previo de todas las edades.
for yr in [2025,2026]:
 f=D/f'enaho{str(yr)[-2:]}_razones.csv';d=pd.read_csv(T/f.name);d=d[d.grupo.str.startswith('Niños')].copy()
 for i,r in d.iterrows():
  out=get(f'ENAHO {yr}','Año 2025' if yr==2025 else 'Semestre 2026','r_'+r.variable,'Nacional','Perú')
  for c in cols:d.loc[i,c]=out[c]
 d.to_csv(f,index=False)
def holm(v):
 s=v.sort_values();return (s*(len(s)-np.arange(len(s)))).cummax().clip(upper=1).reindex(v.index)
# Anual 2025 frente a trimestres 2026: salida de contrastes_temporales.R.
x=pd.read_csv(A/'contrastes_anual_2025_2026.csv');x=x[(x.especificacion=='dominio_estrato')&(x.trimestre<=2)].copy()
x=x.rename(columns={'se':'se_panel','lo':'ic_bajo','hi':'ic_alto','p':'p_valor','lo_independiente':'ic_bajo_independiente','hi_independiente':'ic_alto_independiente'})
labels=pd.read_csv(T/'enaho25_region.csv').set_index('indicador').etiqueta.to_dict()
x['etiqueta']=x.indicador.map(labels);x['periodo']='Referencia: anual 2025';x['tipo']=np.where(x.indicador=='horas_dia_media','media','proporcion')
x['orden']=x.region.map({'Lima Metropolitana':0,'Resto de la Costa':1,'Sierra':2,'Selva':3,'Perú':4})
for i,r in x.iterrows():
 for yr,per in [(2025,'Año 2025'),(2026,f'T{r.trimestre} 2026')]:
  out=get(f'ENAHO {yr}',per,r.indicador,'Nacional' if r.region=='Perú' else 'Región natural',r.region)
  x.loc[i,f'lo{yr}']=out.lo;x.loc[i,f'hi{yr}']=out.hi
x.to_csv(D/'enaho_2025_2026.csv',index=False)
q=pd.read_csv(A/'r_trimestres_2026.csv');q['p_holm']=holm(q.p_valor)
order={'Lima Metropolitana':0,'Resto de la Costa':1,'Sierra':2,'Selva':3,'Perú':4};q['orden']=q.region.map(order)
q.to_csv(D/'enaho26_trimestres.csv',index=False)
# Las pruebas y tamaños de efecto proceden íntegramente de R; se descartan intervalos extremos previos.
r=pd.read_csv(A/'r_rao_scott.csv');prior=pd.read_csv(T/'rao_scott.csv')
labels=dict(zip(prior.indicador,prior.etiqueta));labels.update(todos_dias='Agua todos los días (P110C)',trata_agua='Trata el agua para beber (HV237)',vih_mosquito_sin_ns='VIH por mosquito: excluye «no sabe» (sensibilidad)')
r['etiqueta']=r.indicador.map(labels)
r['clave']=r.fuente.str.replace(' ','_')+'.'+r.indicador+'.'+r.nivel.map({'Región natural':'region','Departamento':'depto'})
r=r.rename(columns={'F':'rs_F','gl1':'rs_gl1','gl2':'rs_gl2','p':'rs_p'})
r['fuente_metodo']='R survey 4.2.1: svychisq F; dominios sobre diseño completo; lonely.psu=adjust'
r.to_csv(D/'rao_scott.csv',index=False)
# Inventario público de agregados, jamás HHID, CASEID o registros individuales.
human={}
for name in ['endes25_region','enaho25_region','enaho26_region']:
 d=pd.read_csv(D/(name+'.csv'));human.update(dict(zip(d.indicador,d.etiqueta)))
for name in ['enaho25_razones','enaho26_razones']:
 d=pd.read_csv(D/(name+'.csv'));human.update({'r_'+a:b for a,b in zip(d.variable,d.razon)})
human['vih_mosquito_sin_ns']='VIH por mosquito: excluye «no sabe»'
E['etiqueta']=E.indicador.map(human).fillna(E.indicador)
E.to_csv(D/'r_estimaciones.csv',index=False)
for name in ['r_control_faltantes.csv','r_sesion.txt']:
 shutil.copyfile(A/name,D/name)
summary={'estimaciones':len(E),'confiables':int((E.cv<=.15).sum()),'referenciales':int(((E.cv>.15)&(E.cv<=.30)).sum()),'imprecisas':int((E.cv>.30).sum()),'rao_scott':len(r),'comparaciones':len(x),'panel_nominal':int((x.p_valor<.05).sum()),'panel_holm':int((x.p_holm<.05).sum()),'independiente_nominal':int((x.p_independiente<.05).sum()),'independiente_holm':int((x.p_holm_independiente<.05).sum()),'filas_actualizadas':counts}
(D/'revision_r.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2))
print(json.dumps(summary,ensure_ascii=False))
