// extern_provider.hako — HakoruneExternProviderBox
// Responsibility: minimal extern/global call handling on Hako side.
// Scope (20.38準備): env.get / console.log のみ（C‑ABI導線は後段で接続）。

using selfhost.vm.hakorune-vm.str_cast as StrCast
using selfhost.shared.host_bridge.codegen_bridge as CodegenBridgeBox

static box HakoruneExternProviderBox {
  get(name, args) {
    // name: string like "env.get" or "env.console.log"
    if name == "env.get" {
      if args == null { return null }
      // args: single string key
      local key = StrCast.to_str(args)
      return env.get(key)
    }
    if name == "env.console.log" || name == "nyash.console.log" || name == "print" {
      // Accept single argument value → print as string
      if args == null { print(""); return 0 }
      print(StrCast.to_str(args))
      return 0
    }
    if name == "env.console.warn" || name == "nyash.console.warn" {
      if args == null { print("[warn]"); return 0 }
      print("[warn] " + (""+args))
      return 0
    }
    if name == "env.console.error" || name == "nyash.console.error" {
      if args == null { print("[error]"); return 0 }
      print("[error] " + (""+args))
      return 0
    }
    if name == "env.mirbuilder.emit" {
      // Optional C‑ABI bridge（既定OFF）: タグを出力しつつ、Rust 側 extern_provider に最小接続
        if env.get("HAKO_V1_EXTERN_PROVIDER_C_ABI") == "1" {
          print("[extern/c-abi:mirbuilder.emit]")
          // Call through to Core extern dispatcher and return the produced JSON (v1)
          local out = hostbridge.extern_invoke("env.mirbuilder", "emit", args)
          return "" + out
      }
      // Default: return empty string (verify/dev stub keeps rc=0)
      return ""
    }
    if name == "env.codegen.emit_object" || name == "env.codegen.emit_object_ny" {
      // Optional C‑ABI bridge（既定OFF）: Rust 側 extern_provider に最小接続
      if env.get("HAKO_V1_EXTERN_PROVIDER_C_ABI") == "1" {
        // 追跡は任意（決定性のため既定はOFF）
        if env.get("HAKO_CABI_TRACE") == "1" { print("[extern/c-abi:codegen.emit_object]") }
        // Call through to Core extern dispatcher and return produced object path
        // 現段階では Core 側で C-API/llvmlite の切替を行う。
        // 互換のため *_ny も最終的に emit_object へ委譲する。
        local out = CodegenBridgeBox.emit_object_args(args)
        return "" + out
      }
      // Default: return empty string (verify/dev stub keeps rc=0)
      return ""
    }
    if name == "env.box_introspect.kind" {
      if env.get("HAKO_V1_EXTERN_PROVIDER_C_ABI") == "1" {
        if env.get("HAKO_CABI_TRACE") == "1" { print("[extern/c-abi:box_introspect.kind]") }
        local out = hostbridge.extern_invoke("env.box_introspect", "kind", args)
        return "" + out
      }
      return ""
    }
    // Unknown: return null for now (caller decides Fail‑Fast)
    return null
  }
}

static box HakoruneExternProviderMain { method main(args) { return 0 } }
