import pandas as pd


def _selected_values(request, *keys):
    values = []

    for key in keys:
        values.extend(request.GET.getlist(key))

    return [value for value in values if value]


def apply_filters(df, request):

    date_start = request.GET.get("date_start") or request.GET.get("start_date")
    date_end = request.GET.get("date_end") or request.GET.get("end_date")

    channels = _selected_values(request, "channels[]", "crm_channels")
    campaigns = _selected_values(request, "campaigns[]", "crm_campaigns")
    devices = _selected_values(request, "devices", "devices[]", "crm_devices")
    forfaits = _selected_values(request, "forfaits", "forfaits[]", "crm_forfaits")

    # FILTER DATE
    if date_start and date_end:
        start = pd.to_datetime(date_start, errors="coerce")
        end = pd.to_datetime(date_end, errors="coerce")

        if not pd.isna(start) and not pd.isna(end):
            df = df[
                (df["Date_Contact"] >= start) &
                (df["Date_Contact"] <= end)
            ]

    # FILTER CHANNELS
    if channels:
        df = df[df["Canal_Entree"].isin(channels)]

    # FILTER CAMPAIGNS
    if campaigns:
        df = df[df["Source_Campagne"].isin(campaigns)]

    # FILTER DEVICES
    if devices and "OS_Mobile" in df.columns:
        normalized_devices = {device.strip().lower() for device in devices}
        df = df[df["OS_Mobile"].fillna("").astype(str).str.lower().isin(normalized_devices)]

    # FILTER FORFAITS
    if forfaits and "Offre_Souhaitee" in df.columns:
        df = df[df["Offre_Souhaitee"].isin(forfaits)]

    return df
