///|
pub enum ValidationIssue {
  NegativeFlow(String)
  EmptyStream(String)
  NonPositiveTemperature(String)
  InvalidFraction(Double)
} derive(Debug)

///|
pub fn validate_stream(stream : Stream) -> Array[ValidationIssue] {
  let issues : Array[ValidationIssue] = []
  if stream.components.length() == 0 {
    issues.push(EmptyStream(stream.id))
  }
  if stream.temperature <= 0.0 {
    issues.push(NonPositiveTemperature(stream.id))
  }
  for component in stream.components {
    if component.molar_flow < 0.0 {
      issues.push(NegativeFlow(stream.id))
    }
  }
  issues
}

///|
pub fn validate_fraction(value : Double) -> Array[ValidationIssue] {
  let issues : Array[ValidationIssue] = []
  if value < 0.0 || value > 1.0 {
    issues.push(InvalidFraction(value))
  }
  issues
}

///|
pub fn has_issues(issues : Array[ValidationIssue]) -> Bool {
  issues.length() > 0
}

///|
pub fn issue_count_for_streams(streams : Array[Stream]) -> Int {
  let mut total = 0
  for stream in streams {
    total += validate_stream(stream).length()
  }
  total
}