///|
pub struct ReportBuilder {
  title : String
  summary : String
  inputs : Array[ChemInput]
  assumptions : Array[Assumption]
  formulas : Array[Formula]
  results : Array[ChemResult]
  warnings : Array[ReportWarning]
  sources : Array[DataSource]
} derive(Debug, Eq)

///|
pub fn report_builder(title : String, summary? : String = "") -> ReportBuilder {
  {
    title,
    summary,
    inputs: [],
    assumptions: [],
    formulas: [],
    results: [],
    warnings: [],
    sources: [],
  }
}

///|
pub fn ReportBuilder::add_input(
  self : ReportBuilder,
  value : ChemInput,
) -> ReportBuilder {
  self.inputs.push(value)
  self
}

///|
pub fn ReportBuilder::add_assumption(
  self : ReportBuilder,
  value : Assumption,
) -> ReportBuilder {
  self.assumptions.push(value)
  self
}

///|
pub fn ReportBuilder::add_formula(
  self : ReportBuilder,
  value : Formula,
) -> ReportBuilder {
  self.formulas.push(value)
  self
}

///|
pub fn ReportBuilder::add_result(
  self : ReportBuilder,
  value : ChemResult,
) -> ReportBuilder {
  self.results.push(value)
  self
}

///|
pub fn ReportBuilder::add_warning(
  self : ReportBuilder,
  value : ReportWarning,
) -> ReportBuilder {
  self.warnings.push(value)
  self
}

///|
pub fn ReportBuilder::add_source(
  self : ReportBuilder,
  value : DataSource,
) -> ReportBuilder {
  self.sources.push(value)
  self
}

///|
pub fn ReportBuilder::build(self : ReportBuilder) -> ChemReport {
  report(
    self.title,
    summary=self.summary,
    inputs=self.inputs,
    assumptions=self.assumptions,
    formulas=self.formulas,
    results=self.results,
    warnings=self.warnings,
    sources=self.sources,
  )
}