# -*- coding: utf-8 -*-
"""
auditoria_mensal.py — Compara upload mensal com dados já inseridos no banco
Lógica: lê o CSV mensal, compara com banco dia a dia, retorna divergências
"""
import pandas as pd
from datetime import date

def auditar_mensal(df_limpo: pd.DataFrame, db_query_fn) -> dict:
    """
    Compara o DataFrame limpo do mensal com o que já está no banco.
    
    Retorna dict com:
      dias_ok        → lista de datas onde o banco bate com o mensal
      dias_divergentes → lista de dicts {data, banco, mensal, diferenca}
      eventos_novos  → DataFrame com eventos do mensal não existentes no banco
      resumo         → dict com totais
    """
    if len(df_limpo) == 0:
        return {
            "dias_ok": [], "dias_divergentes": [],
            "eventos_novos": pd.DataFrame(),
            "resumo": {"ok": 0, "divergentes": 0, "novos": 0},
        }

    data_ini = str(df_limpo["data"].min().date())
    data_fim = str(df_limpo["data"].max().date())

    # Buscar o que já está no banco no mesmo período
    rows_banco = db_query_fn(
        """SELECT chave_evento, motorista, DATE_FORMAT(data_evento,'%%Y-%%m-%%d') as data,
                  hora_evento, tipo, valor
           FROM eventos
           WHERE data_evento BETWEEN %s AND %s""",
        (data_ini, data_fim)
    )

    chaves_banco = set(r["chave_evento"] for r in rows_banco)
    chaves_mensal = set(df_limpo["chave_evento"].tolist())

    # Contagem por dia — banco
    banco_por_dia = {}
    for r in rows_banco:
        d = r["data"]
        banco_por_dia[d] = banco_por_dia.get(d, 0) + 1

    # Contagem por dia — mensal
    mensal_por_dia = {}
    for _, row in df_limpo.iterrows():
        d = str(row["data"].date()) if hasattr(row["data"], "date") else str(row["data"])[:10]
        mensal_por_dia[d] = mensal_por_dia.get(d, 0) + 1

    # Comparar dia a dia
    todos_dias = sorted(set(list(banco_por_dia.keys()) + list(mensal_por_dia.keys())))
    dias_ok          = []
    dias_divergentes = []

    for dia in todos_dias:
        qtd_banco  = banco_por_dia.get(dia, 0)
        qtd_mensal = mensal_por_dia.get(dia, 0)
        if qtd_banco == qtd_mensal:
            dias_ok.append({"data": dia, "quantidade": qtd_mensal})
        else:
            dias_divergentes.append({
                "data":      dia,
                "banco":     qtd_banco,
                "mensal":    qtd_mensal,
                "diferenca": qtd_mensal - qtd_banco,
            })

    # Eventos novos que estão no mensal mas não no banco
    mask_novo = ~df_limpo["chave_evento"].isin(chaves_banco)
    eventos_novos = df_limpo[mask_novo].copy()

    resumo = {
        "periodo_inicio": data_ini,
        "periodo_fim":    data_fim,
        "ok":             len(dias_ok),
        "divergentes":    len(dias_divergentes),
        "novos":          len(eventos_novos),
        "total_banco":    len(rows_banco),
        "total_mensal":   len(df_limpo),
    }

    return {
        "dias_ok":           dias_ok,
        "dias_divergentes":  dias_divergentes,
        "eventos_novos":     eventos_novos,
        "resumo":            resumo,
    }
