///|
pub struct Scenario {
  name : String
  report : ChemReport
} derive(Debug, Eq)

///|
pub struct ScenarioSet {
  name : String
  scenarios : Array[Scenario]
} derive(Debug, Eq)

///|
pub fn scenario(name : String, report : ChemReport) -> Scenario {
  { name, report }
}

///|
pub fn scenario_set(name : String) -> ScenarioSet {
  { name, scenarios: [] }
}

///|
pub fn ScenarioSet::add(self : ScenarioSet, value : Scenario) -> ScenarioSet {
  self.scenarios.push(value)
  self
}

///|
pub fn ScenarioSet::names(self : ScenarioSet) -> Array[String] {
  [
    for value in self.scenarios => value.name
  ]
}

///|
pub fn ScenarioSet::best(self : ScenarioSet) -> Scenario? {
  for value in self.scenarios {
    if value.report.is_publishable() {
      break Some(value)
    }
  } nobreak {
    None
  }
}

///|
pub fn ScenarioSet::review_required(self : ScenarioSet) -> Array[Scenario] {
  [
    for value in self.scenarios if !value.report.is_publishable() => value
  ]
}

///|
pub fn ScenarioSet::to_bundle(self : ScenarioSet) -> ReportBundle {
  report_bundle(self.name, [ for value in self.scenarios => value.report ])
}