package com.example.demo.controller;

import com.example.demo.model.TaskScheme;
import com.example.demo.model.dto.ApiResponse;
import com.example.demo.model.dto.SchemeCompareDTO;
import com.example.demo.service.SchemeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

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

/**
 * 任务方案管理控制器。
 * <p>
 * 提供集中式/分布式任务方案的全生命周期管理 RESTful API。
 * 对应外部接口 SRS-TMS_I_UI、SRS-TMS_I_Planning、SRS-TMS_I_Execution。
 * </p>
 *
 * @requirement(name="集中式/分布式方案列表展示", id="SRS-TMS-01")
 * 以表格或卡片形式展示所有可用任务方案，支持分页加载。
 *
 * @requirement(name="方案详情查看", id="SRS-TMS-03")
 * 展示兵力部署、行动路线、时间节点等详细信息。
 *
 * @requirement(name="多方案对比分析", id="SRS-TMS-04")
 * 支持最多5个方案的关键指标并列比较。
 *
 * @requirement(name="方案分发驱动", id="SRS-TMS-08")
 * 将选定方案解析为指令集，下发至指定执行节点。
 *
 * @requirement(name="执行状态监控", id="SRS-TMS-10")
 * 实时聚合子任务进度，展示整体完成率与当前状态。
 */
@Tag(name = "任务方案管理 (TMS)", description = "任务方案管理软件 - 方案列表、详情、对比、重构、分发、执行监控接口")
@RestController
@RequestMapping("/api/v1/schemes")
public class SchemeController {

    private final SchemeService schemeService;

    public SchemeController(SchemeService schemeService) {
        this.schemeService = schemeService;
    }

    /**
     * 查询方案列表。
     *
     * @param sortField     排序字段（createTime / priority / successRate / estimatedDuration / estimatedLossRatio）
     * @param sortDirection 排序方向（asc / desc）
     * @param page          页码
     * @param size          每页条数
     * @return 方案列表
     */
    @Operation(summary = "查询方案列表", description = "查询所有可用任务方案，支持自定义排序和分页")
    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<List<TaskScheme>> listSchemes(
            @Parameter(description = "排序字段") @RequestParam(required = false, defaultValue = "createTime") String sortField,
            @Parameter(description = "排序方向") @RequestParam(required = false, defaultValue = "desc") String sortDirection,
            @Parameter(description = "页码") @RequestParam(required = false, defaultValue = "0") int page,
            @Parameter(description = "每页条数") @RequestParam(required = false, defaultValue = "20") int size) {
        List<TaskScheme> schemes = schemeService.listSchemes(sortField, sortDirection, page, size);
        return ApiResponse.success(schemes);
    }

    /**
     * 查询方案详情。
     *
     * @param schemeId 方案ID
     * @return 方案详情
     */
    @Operation(summary = "查询方案详情", description = "展示兵力部署、行动路线、时间节点等详细信息及算法溯源")
    @GetMapping(value = "/{schemeId}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<TaskScheme> getSchemeDetail(
            @Parameter(description = "方案ID") @PathVariable String schemeId) {
        Optional<TaskScheme> scheme = schemeService.getSchemeDetail(schemeId);
        return scheme.map(ApiResponse::success)
                .orElseGet(() -> ApiResponse.error(404, "方案不存在: " + schemeId));
    }

    /**
     * 多方案对比分析。
     *
     * @param compareDTO 对比参数（最多5个方案）
     * @return 对比结果
     */
    @Operation(summary = "多方案对比分析", description = "支持最多5个方案的关键指标并列比较（耗时、战损比、成功率等）")
    @PostMapping(value = "/compare", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<Map<String, Object>> compareSchemes(@Valid @RequestBody SchemeCompareDTO compareDTO) {
        try {
            Map<String, Object> result = schemeService.compareSchemes(compareDTO);
            return ApiResponse.success(result);
        } catch (IllegalArgumentException e) {
            return ApiResponse.badRequest(e.getMessage());
        }
    }

    /**
     * 方案重构。
     *
     * @param schemeId       原方案ID
     * @param newConstraints 新约束条件（JSON格式）
     * @return 重构后的新方案
     */
    @Operation(summary = "方案重构", description = "基于新约束条件重新生成或调整现有方案，并保留版本关联追溯")
    @PostMapping(value = "/{schemeId}/reconstruct", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<TaskScheme> reconstructScheme(
            @Parameter(description = "原方案ID") @PathVariable String schemeId,
            @Parameter(description = "新约束条件（JSON格式）") @RequestBody String newConstraints) {
        try {
            TaskScheme newScheme = schemeService.reconstructScheme(schemeId, newConstraints);
            return ApiResponse.success("方案重构成功", newScheme);
        } catch (IllegalArgumentException e) {
            return ApiResponse.badRequest(e.getMessage());
        }
    }

    /**
     * 方案分发。
     *
     * @param schemeId   方案ID
     * @param targetNode 目标执行节点
     * @return 分发结果
     */
    @Operation(summary = "方案分发", description = "将选定方案解析为指令集，下发至指定执行节点")
    @PostMapping(value = "/{schemeId}/dispatch", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<Map<String, Object>> dispatchScheme(
            @Parameter(description = "方案ID") @PathVariable String schemeId,
            @Parameter(description = "目标执行节点") @RequestParam String targetNode) {
        try {
            Map<String, Object> result = schemeService.dispatchScheme(schemeId, targetNode);
            return ApiResponse.success("方案分发成功", result);
        } catch (IllegalArgumentException e) {
            return ApiResponse.badRequest(e.getMessage());
        }
    }

    /**
     * 查询方案执行状态。
     *
     * @param schemeId 方案ID
     * @return 执行状态
     */
    @Operation(summary = "查询执行状态", description = "实时查询方案执行进度、子任务状态及整体完成率")
    @GetMapping(value = "/{schemeId}/execution-status", produces = MediaType.APPLICATION_JSON_VALUE)
    public ApiResponse<Map<String, Object>> getExecutionStatus(
            @Parameter(description = "方案ID") @PathVariable String schemeId) {
        try {
            Map<String, Object> status = schemeService.getExecutionStatus(schemeId);
            return ApiResponse.success(status);
        } catch (IllegalArgumentException e) {
            return ApiResponse.badRequest(e.getMessage());
        }
    }
}
