///|
priv struct ProviderTemplateSeed {
  id : String
  name : String
  base_url : String
  api_format : String
  provider_type : String
  default_model : String
  website_url : String
  api_key_url : String
  category : String
  icon : String
}

///|
priv struct ProviderTemplateTarget {
  id : String
  label : String
  provider_app_type : String
  priority : Int
}

///|
fn moon_provider_template_targets() -> Array[ProviderTemplateTarget] {
  [
    {
      id: "moondesk",
      label: "MoonDesk",
      provider_app_type: "codex",
      priority: 0,
    },
    {
      id: "moonclaw",
      label: "MoonClaw",
      provider_app_type: "openclaw",
      priority: 10,
    },
    {
      id: "moonbook",
      label: "MoonBook",
      provider_app_type: "openclaw",
      priority: 20,
    },
    {
      id: "moontown",
      label: "MoonTown",
      provider_app_type: "openclaw",
      priority: 30,
    },
    {
      id: "claude",
      label: "Claude Code",
      provider_app_type: "claude",
      priority: 100,
    },
    {
      id: "claude-desktop",
      label: "Claude Desktop",
      provider_app_type: "claude-desktop",
      priority: 100,
    },
    { id: "codex", label: "Codex", provider_app_type: "codex", priority: 100 },
    {
      id: "gemini",
      label: "Gemini",
      provider_app_type: "gemini",
      priority: 100,
    },
    {
      id: "opencode",
      label: "OpenCode",
      provider_app_type: "opencode",
      priority: 100,
    },
    {
      id: "openclaw",
      label: "OpenClaw",
      provider_app_type: "openclaw",
      priority: 100,
    },
    {
      id: "hermes",
      label: "Hermes",
      provider_app_type: "hermes",
      priority: 100,
    },
  ]
}

///|
fn moon_provider_template_seeds() -> Array[ProviderTemplateSeed] {
  [
    {
      id: "deepseek-official",
      name: "DeepSeek",
      base_url: "https://api.deepseek.com/v1",
      api_format: "openai_chat",
      provider_type: "openai-compatible",
      default_model: "deepseek-v4-pro",
      website_url: "https://platform.deepseek.com",
      api_key_url: "https://platform.deepseek.com/api_keys",
      category: "official",
      icon: "deepseek",
    },
    {
      id: "openrouter",
      name: "OpenRouter",
      base_url: "https://openrouter.ai/api/v1",
      api_format: "openai_chat",
      provider_type: "openrouter",
      default_model: "openai/gpt-5.6-sol",
      website_url: "https://openrouter.ai",
      api_key_url: "https://openrouter.ai/workspaces/default/keys",
      category: "aggregator",
      icon: "openrouter",
    },
    {
      id: "openrouter-free",
      name: "OpenRouter Free Models Router",
      base_url: "https://openrouter.ai/api/v1",
      api_format: "openai_chat",
      provider_type: "openrouter",
      default_model: "openrouter/free",
      website_url: "https://openrouter.ai/models?max_price=0",
      api_key_url: "https://openrouter.ai/workspaces/default/keys",
      category: "free",
      icon: "openrouter",
    },
    {
      id: "openrouter-ling-free",
      name: "OpenRouter Ling 3.0 Flash (Free)",
      base_url: "https://openrouter.ai/api/v1",
      api_format: "openai_chat",
      provider_type: "openrouter",
      default_model: "inclusionai/ling-3.0-flash:free",
      website_url: "https://openrouter.ai/inclusionai/ling-3.0-flash",
      api_key_url: "https://openrouter.ai/workspaces/default/keys",
      category: "free",
      icon: "openrouter",
    },
    {
      id: "openrouter-nemotron-ultra-free",
      name: "OpenRouter Nemotron 3 Ultra (Free)",
      base_url: "https://openrouter.ai/api/v1",
      api_format: "openai_chat",
      provider_type: "openrouter",
      default_model: "nvidia/nemotron-3-ultra-550b-a55b:free",
      website_url: "https://openrouter.ai/nvidia/nemotron-3-ultra-550b-a55b",
      api_key_url: "https://openrouter.ai/workspaces/default/keys",
      category: "free",
      icon: "openrouter",
    },
    {
      id: "openrouter-laguna-free",
      name: "OpenRouter Laguna M.1 (Free)",
      base_url: "https://openrouter.ai/api/v1",
      api_format: "openai_chat",
      provider_type: "openrouter",
      default_model: "poolside/laguna-m.1:free",
      website_url: "https://openrouter.ai/poolside/laguna-m.1",
      api_key_url: "https://openrouter.ai/workspaces/default/keys",
      category: "free",
      icon: "openrouter",
    },
    {
      id: "fireworks",
      name: "Fireworks AI",
      base_url: "https://api.fireworks.ai/inference/v1",
      api_format: "openai_chat",
      provider_type: "openai-compatible",
      default_model: "accounts/fireworks/models/deepseek-v4-pro",
      website_url: "https://fireworks.ai",
      api_key_url: "https://app.fireworks.ai/settings/users/api-keys",
      category: "aggregator",
      icon: "fireworks",
    },
    {
      id: "siliconflow",
      name: "SiliconFlow",
      base_url: "https://api.siliconflow.cn/v1",
      api_format: "openai_chat",
      provider_type: "openai-compatible",
      default_model: "deepseek-ai/DeepSeek-V4-Pro",
      website_url: "https://siliconflow.cn",
      api_key_url: "https://cloud.siliconflow.cn/me/account/ak",
      category: "aggregator",
      icon: "siliconflow",
    },
    {
      id: "qwen-token-plan",
      name: "Qwen Token Plan",
      base_url: "https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",
      api_format: "openai_chat",
      provider_type: "openai-compatible",
      default_model: "deepseek-v4-pro",
      website_url: "https://platform.qianwenai.com/pricing/token-plan",
      api_key_url: "https://platform.qianwenai.com/pricing/token-plan",
      category: "official",
      icon: "qwen",
    },
    {
      id: "qwen-pay-as-you-go",
      name: "Qwen Pay-As-You-Go",
      base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1",
      api_format: "openai_chat",
      provider_type: "openai-compatible",
      default_model: "kimi/kimi-k3",
      website_url: "https://www.qianwenai.com/models",
      api_key_url: "https://platform.qianwenai.com/docs/api-reference/preparation/api-key",
      category: "official",
      icon: "qwen",
    },
    {
      id: "google-gemini",
      name: "Google Gemini",
      base_url: "https://generativelanguage.googleapis.com",
      api_format: "gemini_native",
      provider_type: "gemini",
      default_model: "gemini-3.6-flash",
      website_url: "https://ai.google.dev/gemini-api",
      api_key_url: "https://aistudio.google.com/api-keys",
      category: "official",
      icon: "gemini",
    },
    {
      id: "anthropic-official",
      name: "Anthropic",
      base_url: "https://api.anthropic.com/v1",
      api_format: "anthropic",
      provider_type: "anthropic-compatible",
      default_model: "claude-sonnet-5",
      website_url: "https://www.anthropic.com",
      api_key_url: "https://platform.claude.com/settings/keys",
      category: "official",
      icon: "anthropic",
    },
    {
      id: "openai-official",
      name: "OpenAI",
      base_url: "https://api.openai.com/v1",
      api_format: "openai",
      provider_type: "openai-compatible",
      default_model: "gpt-5.5",
      website_url: "https://openai.com",
      api_key_url: "https://platform.openai.com/api-keys",
      category: "official",
      icon: "openai",
    },
    {
      id: "zhipu-glm",
      name: "Z.AI (GLM)",
      base_url: "https://open.bigmodel.cn/api/paas/v4",
      api_format: "openai_chat",
      provider_type: "openai-compatible",
      default_model: "glm-5.2",
      website_url: "https://z.ai",
      api_key_url: "https://open.bigmodel.cn/apikey/platform",
      category: "official",
      icon: "zhipu",
    },
    {
      id: "moonshot-kimi",
      name: "Moonshot (Kimi)",
      base_url: "https://api.moonshot.cn/v1",
      api_format: "openai_chat",
      provider_type: "openai-compatible",
      default_model: "kimi-k3",
      website_url: "https://platform.kimi.com",
      api_key_url: "https://platform.kimi.com/console/api-keys",
      category: "official",
      icon: "kimi",
    },
  ]
}

///|
fn ProviderTemplateSeed::model_mapping_json(
  self : ProviderTemplateSeed,
  app_type : String,
) -> Json {
  let mapping : Map[String, Json] = {
    "defaultModel": Json::string(self.default_model),
  }
  if app_type == "claude" || app_type == "claude-desktop" {
    mapping["sonnetModel"] = Json::string(self.default_model)
    mapping["haikuModel"] = Json::string(self.default_model)
    mapping["opusModel"] = Json::string(self.default_model)
  }
  Json::object(mapping)
}

///|
fn ProviderTemplateSeed::preset_json(
  self : ProviderTemplateSeed,
  target : ProviderTemplateTarget,
) -> Json {
  let form = {
    "templateLabel": Json::string("\{self.name} / \{self.default_model}"),
    "appType": Json::string(target.provider_app_type),
    "id": Json::string(self.id),
    "name": Json::string(self.name),
    "providerType": Json::string(self.provider_type),
    "baseUrl": Json::string(self.base_url),
    "apiFormat": Json::string(self.api_format),
    "enabled": Json::boolean(true),
    "modelMapping": self.model_mapping_json(target.provider_app_type),
  }.to_json()
  {
    "appType": Json::string(target.id),
    "providerAppType": Json::string(target.provider_app_type),
    "targetAppLabel": Json::string(target.label),
    "targetPriority": Json::number(target.priority.to_double()),
    "id": Json::string("\{target.id}:catalog:\{self.id}"),
    "name": Json::string(self.name),
    "websiteUrl": Json::string(self.website_url),
    "apiKeyUrl": Json::string(self.api_key_url),
    "category": Json::string(self.category),
    "isOfficial": Json::boolean(self.category == "official"),
    "icon": Json::string(self.icon),
    "form": form,
  }.to_json()
}

///|
fn moon_ready_provider_template_catalog() -> Array[Json] {
  let presets : Array[Json] = []
  for target in moon_provider_template_targets() {
    for seed in moon_provider_template_seeds() {
      presets.push(seed.preset_json(target))
    }
  }
  presets
}