///|
pub(all) enum RoutineStatus {
  Planned
  AwaitingModel
  Validating
  Persisted
  Failed(String)
} derive(Debug, Eq, ToJson, FromJson)

///|
pub(all) struct AnalysisRecord {
  run_id : RunId
  snapshot : KlineSnapshot
  stage1 : Stage1Diagnosis?
  stage2 : Stage2Decision?
  validation : Array[ValidationReport]
  status : RoutineStatus
} derive(Debug, Eq, ToJson, FromJson)

///|
pub fn empty_analysis_record(
  run_id : RunId,
  snapshot : KlineSnapshot,
) -> AnalysisRecord {
  {
    run_id,
    snapshot,
    stage1: None,
    stage2: None,
    validation: [],
    status: Planned,
  }
}

///|
pub fn AnalysisRecord::with_stage1(
  self : AnalysisRecord,
  stage1 : Stage1Diagnosis,
) -> AnalysisRecord {
  { ..self, stage1: Some(stage1), status: Validating }
}

///|
pub fn AnalysisRecord::with_stage2(
  self : AnalysisRecord,
  stage2 : Stage2Decision,
) -> AnalysisRecord {
  { ..self, stage2: Some(stage2), status: Validating }
}

///|
pub fn AnalysisRecord::with_validation(
  self : AnalysisRecord,
  report : ValidationReport,
) -> AnalysisRecord {
  let validation = self.validation.copy()
  validation.push(report)
  { ..self, validation, }
}

///|
pub fn AnalysisRecord::persisted(self : AnalysisRecord) -> AnalysisRecord {
  { ..self, status: Persisted }
}