///|
pub struct EnvironmentFact {
  name : String
  actual : String
  expected : String
  available : Bool
}

///|
pub fn environment_fact(
  name : String,
  actual : String,
  expected : String,
  available : Bool,
) -> EnvironmentFact {
  { name, actual, expected, available, }
}

///|
pub fn EnvironmentFact::passed(self : EnvironmentFact) -> Bool {
  self.available && (self.expected == "" || self.actual.contains(self.expected))
}

///|
pub fn EnvironmentFact::to_json(self : EnvironmentFact) -> Json {
  {
    "name": self.name,
    "actual": self.actual,
    "expected": self.expected,
    "available": self.available,
    "passed": self.passed(),
  }
}

///|
pub fn environment_report(facts : Array[EnvironmentFact]) -> Json {
  let mut passed = true
  for fact in facts {
    if !fact.passed() {
      passed = false
    }
  }
  { "compatible": passed, "checks": facts.map(f => f.to_json()).to_json() }
}

///|
pub fn pinned_environment() -> Array[(String, String)] {
  [
    ("moon", "0.1.20260920"),
    ("moonc", "v0.10.14+7d59c7ec9"),
    ("core", "0.10.14+7d59c7ec9"),
    ("async", "0.21.0"),
    ("sdkApi", "26"),
  ]
}

///|
pub fn sdk_candidates(path : String) -> Array[String] {
  [
    path + "/default/openharmony/native",
    path + "/openharmony/native",
    path + "/native",
    path,
  ]
}

///|
pub fn runtime_files() -> Array[String] {
  [
    "include/moonbit.h", "lib/runtime/runtime.c", "lib/runtime/env.c", "lib/runtime/backtrace.c",
    "lib/runtime/sync_io.c", "lib/runtime/utf.c",
  ]
}

///|
pub fn sdk_files() -> Array[String] {
  [
    "build/cmake/ohos.toolchain.cmake", "build-tools/cmake/bin/cmake.exe", "build-tools/cmake/bin/ninja.exe",
    "llvm/bin/clang.exe", "llvm/bin/llvm-readelf.exe", "sysroot/usr/include/napi/native_api.h",
    "NOTICE.txt",
  ]
}