package server

import (
	"context"
	"log"

	"agent/internal/agent"
)

// benchmarkInitialTask 是托管模式启动时发给 Agent 的初始任务消息。
// 系统提示中已包含完整的 Tsecbench 调度规则（并发管理、flag 提交、靶机开关），
// 此处只需一条简短触发指令让 Agent 开始拉取题目并解题。
const benchmarkInitialTask = `Tsecbench 托管评测已启动。平台已通过环境变量注入 BENCHMARK_TOKEN 和 BENCHMARK_BASE_URL。

请立即开始评测：
1. 用 shell 工具读取环境变量：echo $BENCHMARK_BASE_URL && echo $BENCHMARK_TOKEN
2. 用 curl GET $BENCHMARK_BASE_URL/openapi/v1/challenges 获取题目列表
3. 选定多道未完成题目，逐一 POST $BENCHMARK_BASE_URL/openapi/v1/challenges/start?unique_code=<题号> 启动靶机，把并发拉满（默认上限 3）
4. 对每道题调用 run_coop 下发解题任务（task 中写明目标地址、unique_code、BENCHMARK_TOKEN、提交规则）
5. worker 返回 flag 后用 curl 向平台 submit API 提交，关闭已通关靶机，继续补满并发
6. 直到所有题目完成或时限到达

目标：在时限内尽可能多地完成题目、拿到更高总分。`

// StartBenchmark 在托管模式下自动创建会话并触发 Agent 开始解题。
// 由 main.go 在检测到 BENCHMARK_TOKEN 环境变量时以 goroutine 调用。
// 不依赖 HTTP 服务就绪 —— agent.Run 直接操作 Agent 实例，不经 HTTP 路由。
//
// 关键：必须注册持久化的 live emitter。coop 完成后 notifyCoopDone 通过
// liveEmitter 获取 emit 回调来触发汇报轮，若未注册则汇报轮无日志输出、
// 事件丢失，表现为"评测流程结束"后无任何后续日志（实际仍在运行）。
// 注册后不注销：整个评测期间（含所有后续汇报轮）保持日志通道畅通。
func (s *Server) StartBenchmark(ctx context.Context) error {
	session := s.store.Create()
	sessionID := session.ID

	emit := func(event agent.Event) {
		log.Printf("[benchmark] [%s] %v", event.Type, event.Data)
	}
	// 注册 live emitter，让 notifyCoopDone 触发的汇报轮也能输出日志
	s.agent.RegisterLive(sessionID, emit)

	log.Printf("[benchmark] 自动启动评测会话 %s", sessionID)
	return s.agent.Run(ctx, sessionID, benchmarkInitialTask, emit)
}
