///|
pub(all) enum Profile {
  Traceability
  Shipment
  TradeItem
  LogisticUnit
} derive(Debug, Eq)

///|
pub fn available_profiles() -> Array[Profile] {
  [Traceability, Shipment, TradeItem, LogisticUnit]
}

///|
pub struct ProfileReport {
  ok : Bool
  missing : Array[String]
  issues : Array[String]
} derive(Debug, Eq)

///|
pub fn validate_profile(
  message : GS1Message,
  profile : Profile,
) -> ProfileReport {
  let missing : Array[String] = []
  let issues : Array[String] = []
  let required = match profile {
    Traceability => ["01", "10", "17"]
    Shipment => ["01", "10"]
    TradeItem => ["01"]
    LogisticUnit => ["00"]
  }
  for code in required {
    if message.first_value(code) is None {
      missing.push(code)
    }
  }
  if profile is LogisticUnit && message.first_value("01") is Some(_) {
    issues.push("logistic unit should not mix SSCC and GTIN requirements")
  }
  { ok: missing.is_empty() && issues.is_empty(), missing, issues }
}