///|
pub(all) struct SuiteStatusRef {
  status_path : String
  openai_base_url : String
  default_model : String
  ready : Bool
  catalog : Array[ModelCatalogEntry]
  usage : ModelUsageSnapshot
  contracts : Array[SuiteIntegrationContract]
  health_message : String?
} derive(Debug, Eq, ToJson, FromJson)

///|
pub fn moonsuite_suite_status_path(root? : String = "") -> String {
  let workspace_root = if root.trim() == "" { "." } else { root }
  @pathx.join(
    @moonsuite.state_dir(
      @moonsuite.suite_root_for_workspace_root(workspace_root),
    ),
    "suite-status.json",
  )
}

///|
pub fn suite_status_ref(
  status_path : String,
  openai_base_url : String,
  default_model : String,
  ready? : Bool = true,
  catalog? : Array[ModelCatalogEntry] = [],
  usage? : ModelUsageSnapshot = model_usage_snapshot(),
  contracts? : Array[SuiteIntegrationContract] = [],
  health_message? : String,
) -> SuiteStatusRef {
  {
    status_path,
    openai_base_url,
    default_model,
    ready,
    catalog,
    usage,
    contracts,
    health_message,
  }
}

///|
pub fn moongate_suite_status_ref(
  status_path : String,
  openai_base_url : String,
  default_model : String,
  ready? : Bool = true,
  catalog? : Array[ModelCatalogEntry] = [],
  usage? : ModelUsageSnapshot = model_usage_snapshot(),
  contracts? : Array[SuiteIntegrationContract] = [],
  health_message? : String,
) -> SuiteStatusRef {
  {
    status_path,
    openai_base_url,
    default_model,
    ready,
    catalog,
    usage,
    contracts,
    health_message,
  }
}

///|
pub fn SuiteStatusRef::to_gateway(self : SuiteStatusRef) -> ModelGateway {
  moongate_gateway(
    self.openai_base_url,
    self.default_model,
    health=if self.ready { Ready } else { Unavailable },
    catalog=self.catalog,
    usage=self.usage,
    contracts=self.contracts,
  )
}

///|
pub fn SuiteStatusRef::contract_issue_count(self : SuiteStatusRef) -> Int {
  self.contracts.fold(init=0, fn(count, contract) {
    if contract.ready {
      count
    } else {
      count + 1
    }
  })
}