///|
pub(all) enum PatternTag {
  Wedge
  ReversalAttempt
  MajorTrendReversal
  FinalFlag
  H1
  H2
  L1
  L2
  BreakoutTest
  BreakoutPullback
  BreakoutFailure
  AlwaysIn
  Barbwire
  Overlap
  MiddleRange
  FailedSignal
  Triangle
  DoubleTopBottom
  MeasuredMove
  UnknownPattern(String)
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) enum DecisionAction {
  NoOrder
  Wait
  LimitOrder
  BreakoutOrder
  MarketOrder
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) enum ValidationSeverity {
  Info
  Warning
  Error
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct ValidationIssue {
  severity : ValidationSeverity
  path : String
  message : String
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct Stage1Diagnosis {
  cycle_position : CyclePosition
  direction : Direction
  confidence : Int
  market_phase : MarketPhase
  patterns : Array[PatternTag]
  key_signals : Array[String]
  strategy_files_needed : Array[StrategyFile]
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct Stage2Decision {
  action : DecisionAction
  confidence : Int
  rationale : String
  risk_notes : Array[String]
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct Stage1FeatureHints {
  cycle_bias : CyclePosition
  direction_bias : Direction
  pattern_hints : Array[PatternTag]
  notes : Array[String]
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct ValidationReport {
  ok : Bool
  issues : Array[ValidationIssue]
} derive(Debug, Eq, ToJson, FromJson)

///|
pub fn validation_issue(
  severity : ValidationSeverity,
  path : String,
  message : String,
) -> ValidationIssue {
  { severity, path, message }
}

///|
pub fn validation_ok() -> ValidationReport {
  { ok: true, issues: [] }
}

///|
pub fn validation_error(path : String, message : String) -> ValidationReport {
  { ok: false, issues: [validation_issue(Error, path, message)] }
}

///|
pub fn stage1_diagnosis(
  cycle_position : CyclePosition,
  direction : Direction,
  confidence : Int,
  market_phase : MarketPhase,
  patterns : Array[PatternTag],
  key_signals? : Array[String] = [],
  strategy_files_needed? : Array[StrategyFile] = [],
) -> Stage1Diagnosis {
  {
    cycle_position,
    direction,
    confidence,
    market_phase,
    patterns,
    key_signals,
    strategy_files_needed,
  }
}

///|
pub fn stage2_decision(
  action : DecisionAction,
  confidence : Int,
  rationale : String,
  risk_notes? : Array[String] = [],
) -> Stage2Decision {
  { action, confidence, rationale, risk_notes }
}

///|
pub fn stage1_feature_hints(
  cycle_bias : CyclePosition,
  direction_bias : Direction,
  pattern_hints : Array[PatternTag],
  notes? : Array[String] = [],
) -> Stage1FeatureHints {
  { cycle_bias, direction_bias, pattern_hints, notes }
}