syntax = "v1"

type (
	// GetAi：設定 + 模型清單一併回（避免前端分開打兩支）
	GetAiReq {
		// 可選：預覽另一個 provider 的模型清單（不改存檔）
		Provider string `form:"provider,optional"`
	}

	AiSettingsData {
		Provider                 string   `json:"provider"`
		Model                    string   `json:"model"`
		ResearchProvider         string   `json:"research_provider"`
		ResearchModel            string   `json:"research_model"`
		ApiKeyConfigured         bool     `json:"api_key_configured"`
		ResearchApiKeyConfigured bool     `json:"research_api_key_configured"`
		PlatformKeyAvailable     bool     `json:"platform_key_available"`
		// Models — 目前 models_provider 的可用模型（真拉 + 5 分鐘快取）
		Models         []string `json:"models"`
		ModelsProvider string   `json:"models_provider"`
		// SelectedModel — 與 Model 相同；明確給前端「上次設定的模型」
		SelectedModel string `json:"selected_model"`
		// ModelsFromCache — 這次模型清單是否來自快取
		ModelsFromCache bool `json:"models_from_cache,optional"`
		// ModelsError — 真拉失敗時提示（仍回 fallback models）
		ModelsError string `json:"models_error,optional"`
	}

	SaveAiReq {
		Provider                 string `json:"provider,optional"`
		Model                    string `json:"model,optional"`
		ResearchProvider         string `json:"research_provider,optional"`
		ResearchModel            string `json:"research_model,optional"`
		ApiKey                   string `json:"api_key,optional"`
		ResearchApiKey           string `json:"research_api_key,optional"`
		ApiKeyConfigured         *bool  `json:"api_key_configured,optional"`
		ResearchApiKeyConfigured *bool  `json:"research_api_key_configured,optional"`
	}

	PlacementSettingsData {
		WebSearchProvider     string `json:"web_search_provider"`
		ExpandStrategy        string `json:"expand_strategy"`
		BraveApiKeyConfigured bool   `json:"brave_api_key_configured"`
		ExaApiKeyConfigured   bool   `json:"exa_api_key_configured"`
		DevModeEnabled        bool   `json:"dev_mode_enabled"`
		PlatformKeyAvailable  bool   `json:"platform_key_available"`
	}

	SavePlacementReq {
		ExpandStrategy      string `json:"expand_strategy,optional"`
		DevModeEnabled      *bool  `json:"dev_mode_enabled,optional"`
		ExaApiKey           string `json:"exa_api_key,optional"`
		ExaApiKeyConfigured *bool  `json:"exa_api_key_configured,optional"`
	}

	ListModelsReq {
		Provider string `form:"provider,optional"`
	}

	ListModelsData {
		List       []string `json:"list"`
		Provider   string   `json:"provider"`
		// SelectedModel — 若該 provider 為使用者目前存檔 provider，回傳已選 model
		SelectedModel   string `json:"selected_model,optional"`
		FromCache       bool   `json:"from_cache,optional"`
		ModelsError     string `json:"models_error,optional"`
	}

	// Threads OAuth 平台狀態（App Secret 永不回傳）
	ThreadsSettingsData {
		Provider       string `json:"provider"` // fake | meta
		Configured     bool   `json:"configured"`
		OauthReady     bool   `json:"oauth_ready"`
		ConnectPath    string `json:"connect_path"` // 前端連帳入口
		// 給 Meta 後台「Valid OAuth Redirect URIs」貼上用
		CallbackUrl    string `json:"callback_url"`
		// 前端公開 origin（應 https）
		PublicWebBase  string `json:"public_web_base"`
		// App Id 遮罩，例 2733…9930；未設定空字串
		AppIdMasked    string `json:"app_id_masked,optional"`
		Hint           string `json:"hint"`
	}
)

@server (
	group:      settings
	prefix:     /api/v1/settings
	middleware: AuthJWT
)
service gateway {
	@handler GetAi
	get /ai (GetAiReq) returns (AiSettingsData)

	@handler SaveAi
	put /ai (SaveAiReq) returns (AiSettingsData)

	@handler GetPlacement
	get /placement returns (PlacementSettingsData)

	@handler SavePlacement
	put /placement (SavePlacementReq) returns (PlacementSettingsData)

	@handler ListModels
	get /models (ListModelsReq) returns (ListModelsData)

	@handler GetThreads
	get /threads returns (ThreadsSettingsData)
}
