import pandas as pd
import numpy as np
import json

df = pd.read_pickle("D:/Evolução categorias/.worktrees/comissao/analise_produtos.pkl")
df['FORNECEDOR'] = df['FORNECEDOR'].fillna('(SEM FORNECEDOR)')
df['GRUPO'] = df['GRUPO'].fillna('(SEM GRUPO)')

# KPIs
total_est = float(df['VL_ESTOQUE'].sum())
est_parado = float(df[df['QTD_VENDIDA']==0]['VL_ESTOQUE'].sum())
receita = float(df['VL_VENDIDO'].sum())
lucro = float(df['LUCRO_BRUTO'].sum())
n_produtos = int(len(df))
n_parados = int((df['QTD_VENDIDA']==0).sum())
n_baixo_giro = int((df['DIAS_SEM_VENDA'] > 180).sum())
margem_media = float(df[df['VL_VENDIDO']>0]['MARGEM_REAL'].mean())

# Classificação
classif = df['CLASSIFICACAO'].value_counts().to_dict()

# Top 15 fornecedores por estoque parado
forn_agg = df.groupby('FORNECEDOR').agg(
    PROD=('REF_PROD','count'),
    PARADOS=('REF_PROD', lambda x: ((df.loc[x.index,'QTD_VENDIDA']==0) & (df.loc[x.index,'ESTOQUE_ATUAL']>0)).sum()),
    VL_EST_PARADO=('VL_ESTOQUE', lambda x: x[df.loc[x.index,'QTD_VENDIDA']==0].sum()),
    VL_EST_TOTAL=('VL_ESTOQUE','sum'),
    RECEITA=('VL_VENDIDO','sum'),
    LUCRO=('LUCRO_BRUTO','sum'),
).reset_index()
forn_agg['MARGEM'] = np.where(forn_agg['RECEITA']>0, forn_agg['LUCRO']/forn_agg['RECEITA']*100, 0)
forn_agg['PCT_PARADO'] = np.where(forn_agg['VL_EST_TOTAL']>0, forn_agg['VL_EST_PARADO']/forn_agg['VL_EST_TOTAL']*100, 0)
top_forn_parado = forn_agg[forn_agg['VL_EST_PARADO']>0].nlargest(15,'VL_EST_PARADO')
top_forn_receita = forn_agg[forn_agg['RECEITA']>0].nlargest(10,'RECEITA')

# Top grupos
grupo_agg = df.groupby('GRUPO').agg(
    PARADO=('REF_PROD', lambda x: ((df.loc[x.index,'QTD_VENDIDA']==0) & (df.loc[x.index,'ESTOQUE_ATUAL']>0)).sum()),
    VL_EST_PARADO=('VL_ESTOQUE', lambda x: x[df.loc[x.index,'QTD_VENDIDA']==0].sum()),
    VL_EST=('VL_ESTOQUE','sum'),
    RECEITA=('VL_VENDIDO','sum'),
    LUCRO=('LUCRO_BRUTO','sum'),
).reset_index()
grupo_agg['MARGEM'] = np.where(grupo_agg['RECEITA']>0, grupo_agg['LUCRO']/grupo_agg['RECEITA']*100, 0)
top_grupos = grupo_agg[grupo_agg['VL_EST_PARADO']>0].nlargest(12,'VL_EST_PARADO')

# Top 20 produtos mais problemáticos com estoque parado
top_parado = df[(df['QTD_VENDIDA']==0) & (df['ESTOQUE_ATUAL']>0)].nlargest(20,'VL_ESTOQUE')[
    ['NOME','FORNECEDOR','GRUPO','ESTOQUE_ATUAL','PRECO_CUSTO','VL_ESTOQUE','DIAS_SEM_ENTRADA']
].copy()
top_parado['NOME'] = top_parado['NOME'].str.strip()
top_parado['DIAS_SEM_ENTRADA'] = top_parado['DIAS_SEM_ENTRADA'].apply(lambda x: 9999 if x==9999 else int(x))

# Faixa de cobertura
bins = [0,1,3,6,12,24,9999]
labels = ['<1m','1-3m','3-6m','6-12m','12-24m','>24m']
df_cob = df[df['QTD_VENDIDA']>0].copy()
df_cob['FAIXA'] = pd.cut(df_cob['COBERTURA_MESES'], bins=bins, labels=labels, right=True)
cob_dist = df_cob.groupby('FAIXA', observed=True)['VL_ESTOQUE'].sum().to_dict()
cob_dist = {str(k): float(v) for k,v in cob_dist.items()}

data = {
    "kpis": {
        "n_produtos": n_produtos,
        "n_parados": n_parados,
        "n_baixo_giro": n_baixo_giro,
        "total_est": round(total_est,2),
        "est_parado": round(est_parado,2),
        "receita": round(receita,2),
        "lucro": round(lucro,2),
        "margem_media": round(margem_media,1),
        "pct_parado": round(est_parado/total_est*100,1) if total_est else 0,
    },
    "classificacao": {k: int(v) for k,v in classif.items()},
    "top_forn_parado": [
        {"nome": str(r.FORNECEDOR)[:40], "vl_parado": round(float(r.VL_EST_PARADO),2),
         "vl_total": round(float(r.VL_EST_TOTAL),2), "pct": round(float(r.PCT_PARADO),1),
         "parados": int(r.PARADOS), "margem": round(float(r.MARGEM),1)}
        for _, r in top_forn_parado.iterrows()
    ],
    "top_forn_receita": [
        {"nome": str(r.FORNECEDOR)[:40], "receita": round(float(r.RECEITA),2),
         "lucro": round(float(r.LUCRO),2), "margem": round(float(r.MARGEM),1)}
        for _, r in top_forn_receita.iterrows()
    ],
    "top_grupos": [
        {"nome": str(r.GRUPO)[:35], "vl_parado": round(float(r.VL_EST_PARADO),2),
         "vl_total": round(float(r.VL_EST),2), "parados": int(r.PARADO),
         "margem": round(float(r.MARGEM),1)}
        for _, r in top_grupos.iterrows()
    ],
    "top_produtos_parados": [
        {"nome": str(r.NOME)[:50], "fornecedor": str(r.FORNECEDOR)[:30],
         "grupo": str(r.GRUPO)[:25], "estoque": round(float(r.ESTOQUE_ATUAL),2),
         "custo": round(float(r.PRECO_CUSTO),2), "vl_est": round(float(r.VL_ESTOQUE),2),
         "dias": int(r.DIAS_SEM_ENTRADA) if r.DIAS_SEM_ENTRADA != 9999 else None}
        for _, r in top_parado.iterrows()
    ],
    "cobertura_dist": cob_dist,
}

with open("D:/Evolução categorias/.worktrees/comissao/dashboard_data.json","w",encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

print("JSON exportado.")
print(json.dumps(data["kpis"], indent=2, ensure_ascii=False))
