package aifin

// Family identifies one code-owned Wind MCP service family used by this
// provider. Bond and analytics are intentionally absent.
type Family string

const (
	FamilyStockData     Family = "stock_data"
	FamilyFundData      Family = "fund_data"
	FamilyIndexData     Family = "index_data"
	FamilyFinancialDocs Family = "financial_docs"
	FamilyEconomicData  Family = "economic_data"
)

// EndpointPolicy is the immutable endpoint/tool material needed by invocation
// clients and the shared five-endpoint credential probe wiring.
type EndpointPolicy struct {
	Family       Family
	Endpoint     string
	AllowedTools []string
}

// ActionRoute binds one semantic Action to exactly one service family and one
// upstream MCP tool.
type ActionRoute struct {
	Family Family
	Tool   string
}

var endpointPolicies = []EndpointPolicy{
	{
		Family:   FamilyStockData,
		Endpoint: "https://mcp.wind.com.cn/vserver_stock_data/mcp/",
		AllowedTools: []string{
			"get_stock_price_indicators",
			"get_stock_kline",
			"search_stocks",
			"get_stock_fundamentals",
		},
	},
	{
		Family:   FamilyFundData,
		Endpoint: "https://mcp.wind.com.cn/vserver_fund_data/mcp/",
		AllowedTools: []string{
			"get_fund_price_indicators",
			"get_fund_kline",
			"search_funds",
			"get_fund_performance",
		},
	},
	{
		Family:   FamilyIndexData,
		Endpoint: "https://mcp.wind.com.cn/vserver_index_data/mcp/",
		AllowedTools: []string{
			"get_index_price_indicators",
			"get_index_kline",
		},
	},
	{
		Family:   FamilyFinancialDocs,
		Endpoint: "https://mcp.wind.com.cn/vserver_financial_docs/mcp/",
		AllowedTools: []string{
			"get_company_announcements",
			"get_financial_news",
		},
	},
	{
		Family:   FamilyEconomicData,
		Endpoint: "https://mcp.wind.com.cn/vserver_economic_data/mcp/",
		AllowedTools: []string{
			"natural_language_get_edb_data",
		},
	},
}

var actionRoutes = map[string]ActionRoute{
	ActionGetStockPriceIndicators: {
		Family: FamilyStockData,
		Tool:   "get_stock_price_indicators",
	},
	ActionGetStockKline: {
		Family: FamilyStockData,
		Tool:   "get_stock_kline",
	},
	ActionSearchStocks: {
		Family: FamilyStockData,
		Tool:   "search_stocks",
	},
	ActionGetStockFundamentals: {
		Family: FamilyStockData,
		Tool:   "get_stock_fundamentals",
	},
	ActionGetFundPriceIndicators: {
		Family: FamilyFundData,
		Tool:   "get_fund_price_indicators",
	},
	ActionGetFundKline: {
		Family: FamilyFundData,
		Tool:   "get_fund_kline",
	},
	ActionSearchFunds: {
		Family: FamilyFundData,
		Tool:   "search_funds",
	},
	ActionGetFundPerformance: {
		Family: FamilyFundData,
		Tool:   "get_fund_performance",
	},
	ActionGetIndexPriceIndicators: {
		Family: FamilyIndexData,
		Tool:   "get_index_price_indicators",
	},
	ActionGetIndexKline: {
		Family: FamilyIndexData,
		Tool:   "get_index_kline",
	},
	ActionGetCompanyAnnouncements: {
		Family: FamilyFinancialDocs,
		Tool:   "get_company_announcements",
	},
	ActionGetFinancialNews: {
		Family: FamilyFinancialDocs,
		Tool:   "get_financial_news",
	},
	ActionNaturalLanguageGetEDBData: {
		Family: FamilyEconomicData,
		Tool:   "natural_language_get_edb_data",
	},
}

// EndpointPolicies returns a detached stable copy safe for shared validation
// wiring to consume without mutating invocation policy.
func EndpointPolicies() []EndpointPolicy {
	result := make([]EndpointPolicy, 0, len(endpointPolicies))
	for _, policy := range endpointPolicies {
		cloned := policy
		cloned.AllowedTools = append(
			[]string(nil),
			policy.AllowedTools...,
		)
		result = append(result, cloned)
	}
	return result
}

// ActionRoutes returns a detached copy of the complete closed route table.
func ActionRoutes() map[string]ActionRoute {
	result := make(map[string]ActionRoute, len(actionRoutes))
	for action, route := range actionRoutes {
		result[action] = route
	}
	return result
}
