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)')
df['NOME'] = df['NOME'].fillna('').str.strip()

# Produtos com venda
df_v = df[df['VL_VENDIDO'] > 0].copy()

# Faixas de margem
def faixa_margem(m):
    if m < 0:   return 'Negativa'
    if m < 10:  return '0–10%'
    if m < 20:  return '10–20%'
    if m < 30:  return '20–30%'
    if m < 40:  return '30–40%'
    if m < 50:  return '40–50%'
    return '>50%'

df_v['FAIXA_MARGEM'] = df_v['MARGEM_REAL'].apply(faixa_margem)
faixas_order = ['Negativa','0–10%','10–20%','20–30%','30–40%','40–50%','>50%']
dist_faixas = df_v['FAIXA_MARGEM'].value_counts().reindex(faixas_order, fill_value=0).to_dict()

# Top 20 produtos com MENOR margem (incluindo negativos) que têm estoque
piores = df_v[df_v['ESTOQUE_ATUAL'] > 0].nsmallest(50, 'MARGEM_REAL')[
    ['NOME','FORNECEDOR','GRUPO','MARGEM_REAL','PRECO_CUSTO','PRECO_VENDA','VL_VENDIDO','LUCRO_BRUTO','ESTOQUE_ATUAL','QTD_VENDIDA']
].copy()

# Top produtos com MAIOR margem
melhores = df_v[df_v['ESTOQUE_ATUAL'] > 0].nlargest(50, 'MARGEM_REAL')[
    ['NOME','FORNECEDOR','GRUPO','MARGEM_REAL','PRECO_CUSTO','PRECO_VENDA','VL_VENDIDO','LUCRO_BRUTO','ESTOQUE_ATUAL','QTD_VENDIDA']
].copy()

# Por fornecedor: margem média ponderada
forn_margem = df_v.groupby('FORNECEDOR').agg(
    RECEITA=('VL_VENDIDO','sum'),
    LUCRO=('LUCRO_BRUTO','sum'),
    QTD_PRODS=('REF_PROD','count'),
    MARGEM_MEDIA=('MARGEM_REAL','mean'),
).reset_index()
forn_margem['MARGEM_POND'] = np.where(
    forn_margem['RECEITA'] > 0,
    forn_margem['LUCRO'] / forn_margem['RECEITA'] * 100, 0
)
forn_margem_top = forn_margem[forn_margem['RECEITA'] >= 1000].sort_values('MARGEM_POND')

# Por grupo: margem ponderada
grupo_margem = df_v.groupby('GRUPO').agg(
    RECEITA=('VL_VENDIDO','sum'),
    LUCRO=('LUCRO_BRUTO','sum'),
    QTD_PRODS=('REF_PROD','count'),
).reset_index()
grupo_margem['MARGEM_POND'] = np.where(
    grupo_margem['RECEITA'] > 0,
    grupo_margem['LUCRO'] / grupo_margem['RECEITA'] * 100, 0
)
grupo_margem_top = grupo_margem[grupo_margem['RECEITA'] >= 500].sort_values('MARGEM_POND')

# Todos produtos com venda para a tabela completa
todos_prods = df_v.sort_values('MARGEM_REAL')[
    ['NOME','FORNECEDOR','GRUPO','MARGEM_REAL','PRECO_CUSTO','PRECO_VENDA',
     'VL_VENDIDO','LUCRO_BRUTO','ESTOQUE_ATUAL','QTD_VENDIDA']
].copy()

def row2dict_prod(r):
    return {
        "nome": str(r.NOME)[:60],
        "fornecedor": str(r.FORNECEDOR)[:40],
        "grupo": str(r.GRUPO)[:30],
        "margem": round(float(r.MARGEM_REAL), 1),
        "custo": round(float(r.PRECO_CUSTO), 2),
        "venda": round(float(r.PRECO_VENDA), 2),
        "receita": round(float(r.VL_VENDIDO), 2),
        "lucro": round(float(r.LUCRO_BRUTO), 2),
        "estoque": round(float(r.ESTOQUE_ATUAL), 2),
        "qtd_vendida": round(float(r.QTD_VENDIDA), 0),
    }

result = {
    "dist_faixas": {k: int(v) for k, v in dist_faixas.items()},
    "margem_media_geral": round(float(df_v['MARGEM_REAL'].mean()), 1),
    "receita_total": round(float(df_v['VL_VENDIDO'].sum()), 2),
    "lucro_total": round(float(df_v['LUCRO_BRUTO'].sum()), 2),
    "piores_margem": [row2dict_prod(r) for _, r in piores.iterrows()],
    "melhores_margem": [row2dict_prod(r) for _, r in melhores.iterrows()],
    "forn_margem": [
        {"nome": str(r.FORNECEDOR)[:45], "margem": round(float(r.MARGEM_POND), 1),
         "receita": round(float(r.RECEITA), 2), "lucro": round(float(r.LUCRO), 2),
         "qtd_prods": int(r.QTD_PRODS)}
        for _, r in forn_margem_top.iterrows()
    ],
    "grupo_margem": [
        {"nome": str(r.GRUPO)[:35], "margem": round(float(r.MARGEM_POND), 1),
         "receita": round(float(r.RECEITA), 2), "lucro": round(float(r.LUCRO), 2),
         "qtd_prods": int(r.QTD_PRODS)}
        for _, r in grupo_margem_top.iterrows()
    ],
    "todos_produtos": [row2dict_prod(r) for _, r in todos_prods.iterrows()],
}

with open("D:/Evolução categorias/.worktrees/comissao/margem_data.json", "w", encoding="utf-8") as f:
    json.dump(result, f, ensure_ascii=False, indent=2)

print(f"Exportado: {len(result['todos_produtos'])} produtos")
print(f"Margem media: {result['margem_media_geral']}%")
print(f"Piores (top50): {len(result['piores_margem'])}")
print(f"Melhores (top50): {len(result['melhores_margem'])}")
print(f"Dist faixas: {result['dist_faixas']}")
