package tech.easyflow.admin.controller.agent;

import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator;
import org.springframework.web.bind.annotation.*;
import tech.easyflow.admin.dto.chatworkspace.ChatWorkspaceConversationView;
import tech.easyflow.admin.dto.chatworkspace.ChatWorkspaceSessionDetailView;
import tech.easyflow.admin.dto.chatworkspace.ChatWorkspaceSessionPage;
import tech.easyflow.admin.service.agent.AgentSessionService;
import tech.easyflow.chatlog.domain.dto.ChatHistoryPage;
import tech.easyflow.chatlog.domain.query.ChatPageQuery;
import tech.easyflow.common.domain.Result;
import tech.easyflow.common.entity.LoginAccount;
import tech.easyflow.common.satoken.util.SaTokenUtil;
import tech.easyflow.common.web.jsonbody.JsonBody;

import java.math.BigInteger;
import java.util.List;

/**
 * Agent 管理端会话控制器。
 */
@RestController
@RequestMapping("/api/v1/agent/session")
public class AgentSessionController {

    private final AgentSessionService agentSessionService;

    /**
     * 创建 Agent 管理端会话控制器。
     *
     * @param agentSessionService Agent 会话服务
     */
    public AgentSessionController(AgentSessionService agentSessionService) {
        this.agentSessionService = agentSessionService;
    }

    /**
     * 生成 Agent 会话 ID。
     *
     * @return 会话 ID 字符串
     */
    @GetMapping("/generateId")
    public Result<String> generateId() {
        long nextId = new SnowFlakeIDKeyGenerator().nextId();
        return Result.ok(String.valueOf(nextId));
    }

    /**
     * 查询 Agent 会话分页。
     *
     * @param agentId Agent ID，可为空
     * @param query 分页参数
     * @return 会话分页
     */
    @GetMapping("/list")
    public Result<ChatWorkspaceSessionPage> list(BigInteger agentId, ChatPageQuery query) {
        return Result.ok(agentSessionService.queryCurrentUserSessions(currentAccount(), agentId, query));
    }

    /**
     * 查询 Agent 会话详情。
     *
     * @param sessionId 会话 ID
     * @return 会话详情
     */
    @GetMapping("/{sessionId}")
    public Result<ChatWorkspaceSessionDetailView> detail(@PathVariable BigInteger sessionId) {
        return Result.ok(agentSessionService.getCurrentUserSession(currentAccount(), sessionId));
    }

    /**
     * 查询 Agent 会话消息。
     *
     * @param sessionId 会话 ID
     * @param query 分页参数
     * @return 消息分页
     */
    @GetMapping("/{sessionId}/messages")
    public Result<ChatHistoryPage> messages(@PathVariable BigInteger sessionId, ChatPageQuery query) {
        return Result.ok(agentSessionService.queryCurrentUserMessages(currentAccount(), sessionId, query));
    }

    /**
     * 查询 Agent 完整会话。
     *
     * @param sessionId 会话 ID
     * @return 完整会话
     */
    @GetMapping("/{sessionId}/conversation")
    public Result<ChatWorkspaceConversationView> conversation(@PathVariable BigInteger sessionId) {
        return Result.ok(agentSessionService.getCurrentUserConversation(currentAccount(), sessionId));
    }

    /**
     * 重命名 Agent 会话。
     *
     * @param sessionId 会话 ID
     * @param title 新标题
     * @return 操作结果
     */
    @PostMapping("/{sessionId}/rename")
    public Result<Void> rename(@PathVariable BigInteger sessionId,
                               @JsonBody(value = "title", required = true) String title) {
        agentSessionService.renameCurrentUserSession(currentAccount(), sessionId, title);
        return Result.ok();
    }

    /**
     * 保存 Agent 会话临时知识库。
     *
     * @param sessionId 会话 ID
     * @param knowledgeIds 临时知识库 ID
     * @return 操作结果
     */
    @PostMapping("/{sessionId}/extraKnowledges")
    public Result<ChatWorkspaceSessionDetailView> saveExtraKnowledges(@PathVariable BigInteger sessionId,
                                                                      @JsonBody(value = "knowledgeIds") List<BigInteger> knowledgeIds) {
        return Result.ok(agentSessionService.saveCurrentUserExtraKnowledges(currentAccount(), sessionId, knowledgeIds));
    }

    /**
     * 删除 Agent 会话。
     *
     * @param sessionId 会话 ID
     * @return 操作结果
     */
    @PostMapping("/{sessionId}/delete")
    public Result<Void> delete(@PathVariable BigInteger sessionId) {
        agentSessionService.deleteCurrentUserSession(currentAccount(), sessionId);
        return Result.ok();
    }

    private LoginAccount currentAccount() {
        return SaTokenUtil.getLoginAccount();
    }
}
