///|
pub enum ChangeSeverity {
  Low
  Medium
  High
} derive(Debug, Eq)

///|
pub struct ChangeDetail {
  section : String
  severity : ChangeSeverity
  message : String
} derive(Debug, Eq)

///|
fn change_severity(change : ReportChange) -> ChangeSeverity {
  match change {
    TitleChanged | SummaryChanged => Low
    AssumptionsChanged | FormulasChanged | SourcesChanged => Medium
    InputsChanged | ResultsChanged | WarningsChanged => High
  }
}

///|
pub fn describe_report_changes(
  left : ChemReport,
  right : ChemReport,
) -> Array[ChangeDetail] {
  [
    for change in compare_reports(left, right) => {
      {
        section: change_text(change),
        severity: change_severity(change),
        message: "report section '{change_text(change)}' changed",
      }
    }
  ]
}

///|
pub fn ChangeDetail::is_high_risk(self : ChangeDetail) -> Bool {
  self.severity == High
}

///|
pub fn high_risk_changes(changes : Array[ChangeDetail]) -> Array[ChangeDetail] {
  [
    for change in changes if change.is_high_risk() => change
  ]
}