package com.example.demo.controller;

import com.example.demo.model.BusinessItem;
import com.example.demo.service.BusinessService;
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.web.bind.annotation.*;

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

/**
 * 业务数据管理控制器。
 * 提供业务数据完整生命周期的 RESTful API 接口（新增、编辑、删除、提交、审核、驳回、归档、查询筛选）。
 */
@RestController
@RequestMapping("/api/business")
@Tag(name = "业务数据管理", description = "业务数据全生命周期管理接口")
public class BusinessController {

    private final BusinessService businessService;

    public BusinessController(BusinessService businessService) {
        this.businessService = businessService;
    }

    /**
     * 新增业务数据。
     *
     * @requirement(name="业务新增", id="SRS-IMS_F-010")
     *
     * @param item 业务数据
     * @return 创建后的业务数据
     */
    @PostMapping
    @Operation(summary = "新增业务数据", description = "创建新的业务数据（状态为草稿）")
    public BusinessItem createBusinessItem(@RequestBody BusinessItem item) {
        return businessService.createBusinessItem(item);
    }

    /**
     * 编辑业务数据。
     *
     * @requirement(name="业务编辑", id="SRS-IMS_F-011")
     *
     * @param id   业务数据ID
     * @param item 更新信息
     * @return 更新后的业务数据
     */
    @PutMapping("/{id}")
    @Operation(summary = "编辑业务数据", description = "编辑业务数据（仅草稿状态可编辑）")
    public BusinessItem updateBusinessItem(@PathVariable Long id, @RequestBody BusinessItem item) {
        return businessService.updateBusinessItem(id, item);
    }

    /**
     * 删除业务数据。
     *
     * @requirement(name="业务删除", id="SRS-IMS_F-012")
     *
     * @param id 业务数据ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    @Operation(summary = "删除业务数据", description = "根据ID删除业务数据")
    public Map<String, Object> deleteBusinessItem(@PathVariable Long id) {
        businessService.deleteBusinessItem(id);
        return Map.of("message", "业务数据删除成功", "id", id);
    }

    /**
     * 提交业务数据至审核流程。
     *
     * @requirement(name="业务提交", id="SRS-IMS_F-013")
     *
     * @param id 业务数据ID
     * @return 更新后的业务数据
     */
    @PutMapping("/{id}/submit")
    @Operation(summary = "提交审核", description = "提交业务数据至审核流程（草稿→待审核）")
    public BusinessItem submitBusinessItem(@PathVariable Long id) {
        return businessService.submitBusinessItem(id);
    }

    /**
     * 审核通过业务数据。
     *
     * @requirement(name="业务审核", id="SRS-IMS_F-014")
     *
     * @param id 业务数据ID
     * @return 更新后的业务数据
     */
    @PutMapping("/{id}/approve")
    @Operation(summary = "审核通过", description = "审核通过业务数据（待审核→已通过）")
    public BusinessItem approveBusinessItem(@PathVariable Long id) {
        return businessService.approveBusinessItem(id);
    }

    /**
     * 驳回业务数据。
     *
     * @requirement(name="业务驳回", id="SRS-IMS_F-015")
     *
     * @param id 业务数据ID
     * @return 更新后的业务数据
     */
    @PutMapping("/{id}/reject")
    @Operation(summary = "驳回业务数据", description = "驳回业务数据（待审核→已驳回）")
    public BusinessItem rejectBusinessItem(@PathVariable Long id) {
        return businessService.rejectBusinessItem(id);
    }

    /**
     * 归档业务数据。
     *
     * @requirement(name="业务归档", id="SRS-IMS_F-016")
     *
     * @param id 业务数据ID
     * @return 更新后的业务数据
     */
    @PutMapping("/{id}/archive")
    @Operation(summary = "归档业务数据", description = "归档业务数据（已通过→已归档）")
    public BusinessItem archiveBusinessItem(@PathVariable Long id) {
        return businessService.archiveBusinessItem(id);
    }

    /**
     * 多条件组合查询业务数据。
     *
     * @requirement(name="查询筛选", id="SRS-IMS_F-017")
     *
     * @param title     标题关键字（可选）
     * @param type      业务类型（可选）
     * @param status    状态（可选）
     * @param createdBy 创建人ID（可选）
     * @param page      页码，默认0
     * @param size      每页条数，默认10
     * @return 符合条件的业务数据列表
     */
    @GetMapping
    @Operation(summary = "多条件查询", description = "支持按标题、类型、状态、创建人多条件组合查询和分页")
    public List<BusinessItem> searchBusinessItems(
            @Parameter(description = "标题关键字") @RequestParam(required = false) String title,
            @Parameter(description = "业务类型") @RequestParam(required = false) String type,
            @Parameter(description = "状态") @RequestParam(required = false) String status,
            @Parameter(description = "创建人ID") @RequestParam(required = false) Long createdBy,
            @Parameter(description = "页码") @RequestParam(defaultValue = "0") int page,
            @Parameter(description = "每页条数") @RequestParam(defaultValue = "10") int size) {
        return businessService.searchBusinessItems(title, type, status, createdBy, page, size);
    }

    /**
     * 根据ID查询业务数据详情。
     *
     * @param id 业务数据ID
     * @return 业务数据详情
     */
    @GetMapping("/{id}")
    @Operation(summary = "查询业务数据详情", description = "根据ID获取业务数据详细信息")
    public BusinessItem getBusinessItem(@PathVariable Long id) {
        return businessService.getBusinessItem(id);
    }
}
