import glob, json
from collections import defaultdict
MAP=json.load(open('mun_map.json'))
C_COMP,C_MUN,C_SEC,C_SALDO=0,3,4,6
rows=[]
def load(pat,kind):
    for f in sorted(glob.glob(pat)):
        with open(f,encoding='utf-8',errors='replace') as fh:
            fh.readline()
            for line in fh:
                p=line.rstrip('\n').split(';')
                if len(p)>6: rows.append((kind,p[C_COMP],p[C_MUN],p[C_SEC],int(p[C_SALDO])))
load('pi_CAGEDMOV*.csv','MOV'); load('pi_CAGEDFOR*.csv','FOR'); load('pi_CAGEDEXC*.csv','EXC')

def acum(ano, mun=None):
    a=d=0
    for kind,comp,m,sec,s in rows:
        if not comp.startswith(str(ano)): continue
        if int(comp[4:])>7: continue
        if mun and m!=mun: continue
        sg=-1 if kind=='EXC' else 1
        if s==1: a+=sg
        else: d+=sg
    return a,d

print("=== OEIRAS: jan-jul 2025 x jan-jul 2026 ===")
for ano in (2025,2026):
    a,d=acum(ano,'220700'); print(f"  {ano}: admissoes {a}  desligamentos {d}  saldo {a-d:+d}")
a25,d25=acum(2025,'220700'); a26,d26=acum(2026,'220700')
print(f"  variacao do saldo: {(a26-d26)-(a25-d25):+d}")

print("\n=== PIAUI (estado) jan-jul ===")
for ano in (2025,2026):
    a,d=acum(ano); print(f"  {ano}: admissoes {a}  desligamentos {d}  saldo {a-d:+d}")

# ranking 2026
per=defaultdict(lambda:[0,0])
for kind,comp,m,sec,s in rows:
    if not comp.startswith('2026') or int(comp[4:])>7: continue
    sg=-1 if kind=='EXC' else 1
    per[m][0 if s==1 else 1]+=sg
rank=sorted(((MAP.get(m,m), v[0]-v[1], v[0], v[1], m) for m,v in per.items()), key=lambda x:-x[1])
print(f"\n=== RANKING PIAUI — saldo jan-jul/2026 ({len(rank)} municipios com movimento) ===")
for i,(nome,sal,a,d,cod) in enumerate(rank[:15],1):
    print(f"{i:3d}. {nome:<28} {sal:+6d}  (adm {a}, desl {d})")
pos=[i for i,r in enumerate(rank,1) if r[4]=='220700'][0]
print(f"...\nOEIRAS: {pos}o lugar entre {len(rank)} municipios com movimentacao")
print("\nVizinhos no ranking:")
for i in range(max(0,pos-4), min(len(rank),pos+3)):
    n,sal,a,d,c=rank[i]
    mark='  <<<' if c=='220700' else ''
    print(f"{i+1:3d}. {n:<28} {sal:+6d}{mark}")
