package com.example.demo.controller;

import com.example.demo.model.TaskDraft;
import com.example.demo.model.dto.ApiResponse;
import com.example.demo.service.TaskGenerationService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

/**
 * 任务生成控制器。
 * <p>
 * 提供任务草案生成、查询、发送与重试等 RESTful API 接口。
 * 对应外部接口 IF-03 / SRS-EHTG_O_TSK。
 * </p>
 *
 * @requirement(name="任务模板匹配与生成", id="SRS-EHTG-06")
 * 结合知识库中的任务模板，自动生成符合标准的任务草案。
 *
 * @requirement(name="任务草案发送与重试机制", id="SRS-EHTG-07")
 * 向下游任务规划引擎发送请求，失败时自动加入本地重试队列。
 */
@Tag(name = "任务生成 (EHTG)", description = "事件处理与任务生成模块 - 任务草案生成、发送与重试接口")
@RestController
@RequestMapping("/api/v1/tasks")
public class TaskController {

    private final TaskGenerationService taskGenerationService;

    public TaskController(TaskGenerationService taskGenerationService) {
        this.taskGenerationService = taskGenerationService;
    }

    /**
     * 基于事件生成任务草案。
     *
     * @param eventId 事件ID
     * @return 生成的任务草案
     */
    @Operation(summary = "生成任务草案", description = "基于事件评估结果，匹配任务模板并生成任务草案")
    @PostMapping(value = "/generate", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<TaskDraft> generateTaskDraft(
            @Parameter(description = "事件ID") @RequestParam String eventId) {
        try {
            TaskDraft draft = taskGenerationService.generateTaskDraft(eventId);
            return ApiResponse.success("任务草案生成成功", draft);
        } catch (IllegalArgumentException | IllegalStateException e) {
            return ApiResponse.badRequest(e.getMessage());
        }
    }

    /**
     * 查询任务草案列表。
     *
     * @return 草案列表
     */
    @Operation(summary = "查询任务草案列表", description = "查询所有已生成的任务草案")
    @GetMapping(value = "/drafts", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<List<TaskDraft>> listDrafts() {
        return ApiResponse.success(taskGenerationService.getAllDrafts());
    }

    /**
     * 查询任务草案详情。
     *
     * @param draftId 草案ID
     * @return 草案详情
     */
    @Operation(summary = "查询任务草案详情", description = "根据草案ID查询任务草案详细信息")
    @GetMapping(value = "/drafts/{draftId}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<TaskDraft> getDraft(
            @Parameter(description = "草案ID") @PathVariable String draftId) {
        Optional<TaskDraft> draft = taskGenerationService.getDraftById(draftId);
        return draft.map(ApiResponse::success)
                .orElseGet(() -> ApiResponse.error(404, "任务草案不存在: " + draftId));
    }

    /**
     * 发送任务草案到下游引擎。
     *
     * @param draftId 草案ID
     * @return 发送结果
     */
    @Operation(summary = "发送任务草案", description = "将任务草案发送至下游任务规划引擎")
    @PostMapping(value = "/drafts/{draftId}/send", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<String> sendDraft(
            @Parameter(description = "草案ID") @PathVariable String draftId) {
        boolean success = taskGenerationService.sendTaskDraft(draftId);
        if (success) {
            return ApiResponse.success("任务草案发送成功", draftId);
        } else {
            return ApiResponse.error(500, "任务草案发送失败，已加入重试队列");
        }
    }

    /**
     * 重试发送失败的任务草案。
     *
     * @param draftId 草案ID
     * @return 重试结果
     */
    @Operation(summary = "重试发送任务草案", description = "重试发送之前失败的任务草案")
    @PostMapping(value = "/drafts/{draftId}/retry", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<String> retrySendDraft(
            @Parameter(description = "草案ID") @PathVariable String draftId) {
        boolean success = taskGenerationService.retrySendDraft(draftId);
        if (success) {
            return ApiResponse.success("任务草案重试发送成功", draftId);
        } else {
            return ApiResponse.error(500, "任务草案重试发送失败");
        }
    }
}
