"""Recuperation des features de prediction.

Dans un systeme reel, ces valeurs proviendraient d'un feature store / d'une base
alimentee par le pipeline de calcul de features (lags, moyennes glissantes) sur
l'historique de consommation. On separe volontairement cette etape du calcul de la
prediction : la source des features peut changer sans toucher au modele.

Ici on SIMULE cette recuperation par un simple dictionnaire Python, comme demande
par l'enonce. Les valeurs sont des observations reelles (derniere ligne connue de
quelques clients dans data/test.parquet).
"""

from .. import constants


class UnknownClientError(KeyError):
    """Aucune feature disponible pour ce client (identifiant inconnu)."""


# feature store simule : client_id -> {feature: valeur}
FEATURE_STORE: dict[str, dict[str, float]] = {
    "MT_124": {
        "lag_1d": 107.656,
        "lag_7d": 25.120,
        "lag_30d": 70.574,
        "lag_365d": 25.120,
        "rolling_mean_7d": 65.870,
        "rolling_mean_30d": 71.310,
    },
    "MT_156": {
        "lag_1d": 13.149,
        "lag_7d": 13.929,
        "lag_30d": 21.577,
        "lag_365d": 8.935,
        "rolling_mean_7d": 16.648,
        "rolling_mean_30d": 19.720,
    },
    "MT_158": {
        "lag_1d": 30.739,
        "lag_7d": 16.608,
        "lag_30d": 34.094,
        "lag_365d": 6.574,
        "rolling_mean_7d": 19.067,
        "rolling_mean_30d": 21.486,
    },
    "MT_159": {
        "lag_1d": 23.305,
        "lag_7d": 24.741,
        "lag_30d": 21.386,
        "lag_365d": 5.333,
        "rolling_mean_7d": 11.707,
        "rolling_mean_30d": 13.619,
    },
}


def get_features(client_id: str) -> dict[str, float]:
    """Renvoyer les features du client, ordonnees comme a l'entrainement du modele.

    Leve UnknownClientError si le client est inconnu.
    """
    if client_id not in FEATURE_STORE:
        raise UnknownClientError(client_id)
    raw = FEATURE_STORE[client_id]
    # On respecte l'ordre des colonnes attendu par le modele (SERVING_FEATURES).
    return {feature: raw[feature] for feature in constants.SERVING_FEATURES}
