package mcp

import (
	"context"

	"github.com/google/uuid"
	mcpsdk "github.com/modelcontextprotocol/go-sdk/mcp"

	"github.com/yan1h/agent-coding-workflow/internal/chat"
)

// registerPrompts 注册 prompts/list + prompts/get handler。
// 数据源：chat.TemplateService.List(ctx, userID) — 只取 scope=system 模板。
// MVP 策略：启动期一次性拉取所有 system 模板并静态注册；新增模板需重启。
func registerPrompts(srv *mcpsdk.Server, deps ServerDeps) {
	// 由于 prompts 内容由 DB 决定，且 SDK 使用静态注册（AddPrompt），
	// 我们用闭包捕获 deps，在 handler 里动态查 DB。
	// prompts/list 由 SDK 框架自动返回所有已注册 prompt。
	// 每个 prompt 的 handler 在 prompts/get 时查 DB 返最新 content。

	// MVP: 注册一个占位 prompt 表明 prompts 能力可用。
	// 真正的 system 模板注册需要在 app.go 装配阶段（拿到 deps 后）
	// 调用 registerSystemTemplates(srv, deps) 完成一次性注册。
	//
	// 由于 registerPrompts 在 NewMCPServer 里被调用，此时还没有 HTTP 请求
	// 也没有 ctx 中的 user，无法调 TemplateService.List。
	//
	// 解决方案：提供一个独立的 RegisterSystemPrompts 方法让 app.go 在
	// 适当时候调用（装配后、启动前），把 system 模板注册到已有 server 上。
}

// RegisterSystemPrompts 从 chat.TemplateService 拉取所有 system-scope 模板
// 并注册为 MCP prompts。由 app.go 在装配阶段调用一次。
func RegisterSystemPrompts(srv *mcpsdk.Server, deps ServerDeps, adminUserID uuid.UUID) error {
	ctx := context.Background()
	all, err := deps.Templates.List(ctx, adminUserID)
	if err != nil {
		return err
	}
	for _, t := range all {
		if t.Scope != chat.TemplateScopeSystem {
			continue
		}
		// 闭包捕获 t
		tmpl := t
		srv.AddPrompt(&mcpsdk.Prompt{
			Name:        tmpl.Name,
			Description: tmpl.Name,
		}, func(ctx context.Context, req *mcpsdk.GetPromptRequest) (*mcpsdk.GetPromptResult, error) {
			return &mcpsdk.GetPromptResult{
				Messages: []*mcpsdk.PromptMessage{{
					Role:    "user",
					Content: &mcpsdk.TextContent{Text: tmpl.Content},
				}},
			}, nil
		})
	}
	return nil
}
