import pandas as pd
import matplotlib.pyplot as plt
from app.Models.fox_products_models import (
                                            fox_descripc,
                                             fox_leyendas,
                                               fox_a_tiposb,
                                               fox_a_caract,
                                                 fox_a_segmto,
                                                 fox_divisiones,
                                                 fox_a_concom,
                                                 fox_a_materl,
                                                 fox_a_color,
                                                 fox_a_linea,
                                                 fox_cmp_aper,
                                                 fox_prove_pf,
                                                 fox_indices_indec,
                                                 fox_ifx_calendario,
                                                 fox_empresa,
                                                 fox_r_catept,
                                                 fox_catehog,
                                                 fox_r_subdiv,
                                                 fox_a_subdiv,
                                                 fox_a_caract,
                                                 fox_cmp
                                                )








def calcular_estadisticas_unidades(ano_from, camp_from, ano_to, camp_to):
    # Paso 1: Obtener todos los datos del año
    qs = fox_cmp.objects.filter(
        ano__gte=ano_from,
        ano__lte=ano_to
    ).values('ano', 'camp', 'unidades', 'unid_est')

    df = pd.DataFrame.from_records(qs)
    if df.empty:
        return {
            'categories': [],
            'series': [],
            'max_axis': 0,
            'total_unidades': 0,
            'total_estimadas': 0,
            'promedio_unidades': 0,
            'promedio_estimadas': 0
        }

    # Paso 2: Limpieza de datos
    df['unidades'] = pd.to_numeric(df['unidades'], errors='coerce')
    df['unid_est'] = pd.to_numeric(df['unid_est'], errors='coerce')
    df['camp'] = pd.to_numeric(df['camp'], errors='coerce')
    df['ano'] = pd.to_numeric(df['ano'], errors='coerce')
    df.dropna(subset=['camp', 'unidades', 'unid_est', 'ano'], inplace=True)

    # Paso 3: Filtro por rango de campaña y año
    df = df[
        (df['ano'] > ano_from) | ((df['ano'] == ano_from) & (df['camp'] >= camp_from))
    ]
    df = df[
        (df['ano'] < ano_to) | ((df['ano'] == ano_to) & (df['camp'] <= camp_to))
    ]

    if df.empty:
        return {
            'categories': [],
            'series': [],
            'max_axis': 0,
            'total_unidades': 0,
            'total_estimadas': 0,
            'promedio_unidades': 0,
            'promedio_estimadas': 0
        }

    # Paso 4: Datos para gráfico
    data_grafico = generar_datos_grafico(df)

    # Paso 5: Datos resumen
    data_resumen = calcular_resumen_estadistico(df)

    # Paso 6: Unión y retorno
    return {**data_grafico, **data_resumen}


def generar_datos_grafico(df):
    df['camp_label'] = df['ano'].astype(str) + '-' + df['camp'].astype(str)

    grouped = df.groupby('camp_label').agg({
        'unidades': 'sum',
        'unid_est': 'sum'
    }).reset_index()

    categories = grouped['camp_label'].tolist()
    unidades_sum = grouped['unidades'].round(2).tolist()
    unid_est_sum = grouped['unid_est'].round(2).tolist()

    return {
        'categories': categories,
        'series': [
            {'name': 'Unidades', 'data': unidades_sum},
            {'name': 'Unid Estimada', 'data': unid_est_sum}
        ],
        'max_axis': int(max(unidades_sum + unid_est_sum)) + 10
    }


def calcular_resumen_estadistico(df):
    total_unidades = df['unidades'].sum()
    total_estimadas = df['unid_est'].sum()
    promedio_unidades = df['unidades'].mean().round(2)
    promedio_estimadas = df['unid_est'].mean().round(2)

    return {
        'total_unidades': int(total_unidades),
        'total_estimadas': int(total_estimadas),
        'promedio_unidades': promedio_unidades,
        'promedio_estimadas': promedio_estimadas
    }