"""Causal multi-timescale companions for the dense MLP experiment."""
from __future__ import annotations

import pandas as pd


TEMPORAL_BASE_COLS = (
    "stoch_norm", "osc_norm", "m3_momentum_norm", "vwap_div_norm",
    "oi_roc_norm", "usdt_d_norm", "basis_norm", "cvd_norm",
    "rvol_norm", "bb_pct_b_norm",
)
TEMPORAL_SPANS = (3, 12)


def temporal_feature_cols() -> list[str]:
    return [f"{column}_ema{span}" for column in TEMPORAL_BASE_COLS for span in TEMPORAL_SPANS]


def inject_temporal_features(df: pd.DataFrame) -> list[str]:
    """Add past-and-current-only EMA summaries and return their column names."""
    missing = [column for column in TEMPORAL_BASE_COLS if column not in df.columns]
    if missing:
        raise ValueError(f"Cannot build temporal features; missing source columns: {missing}")
    columns = temporal_feature_cols()
    for column in TEMPORAL_BASE_COLS:
        values = pd.to_numeric(df[column], errors="coerce").fillna(0.0)
        for span in TEMPORAL_SPANS:
            df[f"{column}_ema{span}"] = values.ewm(span=span, adjust=False, min_periods=1).mean()
    return columns
