///|
pub(all) enum RoutinePhase {
  CreateRunContext
  SnapshotMarketData
  Stage1Diagnosis
  Stage1Validation
  StrategyRouting
  Stage2Decision
  Stage2Validation
  PersistAnalysis
  FollowUpReady
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct RoutinePlan {
  run_id : @domain.RunId
  phases : Array[RoutinePhase]
} derive(Debug, Eq, ToJson, FromJson)

///|
pub fn default_phases() -> Array[RoutinePhase] {
  [
    CreateRunContext,
    SnapshotMarketData,
    Stage1Diagnosis,
    Stage1Validation,
    StrategyRouting,
    Stage2Decision,
    Stage2Validation,
    PersistAnalysis,
    FollowUpReady,
  ]
}

///|
pub fn routine_plan(run_id : @domain.RunId) -> RoutinePlan {
  { run_id, phases: default_phases() }
}

///|
pub fn RoutinePhase::label(self : RoutinePhase) -> String {
  match self {
    CreateRunContext => "create_run_context"
    SnapshotMarketData => "snapshot_market_data"
    Stage1Diagnosis => "stage1_diagnosis"
    Stage1Validation => "stage1_validation"
    StrategyRouting => "strategy_routing"
    Stage2Decision => "stage2_decision"
    Stage2Validation => "stage2_validation"
    PersistAnalysis => "persist_analysis"
    FollowUpReady => "follow_up_ready"
  }
}