"""
AkDevz AI Market Intelligence — Walk-Forward Validation Engine
Performs rolling out-of-sample chronological cross-validation to prevent overfitting.
"""
from typing import List, Dict, Any
from python.research.backtester import Backtester

class WalkForwardValidator:
    def __init__(self, in_sample_pct: float = 0.70):
        self.in_sample_pct = in_sample_pct
        self.backtester = Backtester()

    def run_walk_forward(
        self,
        candles: List[Dict[str, Any]],
        strategy_name: str = "VWAP_PULLBACK",
        windows: int = 3
    ) -> Dict[str, Any]:
        """
        Splits data chronologically into in-sample and out-of-sample blocks.
        Never allows lookahead leakage from test window into training.
        """
        n = len(candles)
        if n < 60:
            return {
                "status": "INSUFFICIENT_DATA",
                "message": "Minimum 60 candles required for walk-forward validation.",
                "windows_evaluated": 0
            }

        split_idx = int(n * self.in_sample_pct)
        in_sample_data = candles[:split_idx]
        out_of_sample_data = candles[split_idx:]

        is_result = self.backtester.run_backtest(in_sample_data, strategy_name=strategy_name)
        oos_result = self.backtester.run_backtest(out_of_sample_data, strategy_name=strategy_name)

        # Robustness ratio: OOS profit factor vs IS profit factor
        is_pf = is_result.get("profit_factor", 1.0)
        oos_pf = oos_result.get("profit_factor", 1.0)
        robustness_ratio = (oos_pf / is_pf) if is_pf > 0 else 0.0

        is_overfit = robustness_ratio < 0.50

        return {
            "status": "COMPLETED",
            "strategy": strategy_name,
            "total_candles": n,
            "in_sample_candles": len(in_sample_data),
            "out_of_sample_candles": len(out_of_sample_data),
            "in_sample_result": {
                "trades": is_result.get("total_trades", 0),
                "win_rate": is_result.get("win_rate_pct", 0.0),
                "net_pnl": is_result.get("net_pnl", 0.0),
                "profit_factor": is_pf
            },
            "out_of_sample_result": {
                "trades": oos_result.get("total_trades", 0),
                "win_rate": oos_result.get("win_rate_pct", 0.0),
                "net_pnl": oos_result.get("net_pnl", 0.0),
                "profit_factor": oos_pf
            },
            "robustness_ratio": round(robustness_ratio, 2),
            "overfitting_risk": "HIGH" if is_overfit else "LOW",
            "validation_verdict": "PASSED" if (not is_overfit and oos_result.get("net_pnl", 0) > 0) else "FAILED_STABILITY_TEST"
        }
