package jnpf.cultivate.v2.controller.web.task;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.github.pagehelper.PageInfo;
import jnpf.base.ActionResult;
import jnpf.base.vo.PageListVO;
import jnpf.cultivate.v2.service.V2CultivateTaskCountService;
import jnpf.cultivate.v2.service.V2CultivateTaskService;
import jnpf.model.cultivate.CultivatePage;
import jnpf.model.cultivate.dto.learn.FtbCultivateLearnAllocationDTO;
import jnpf.model.cultivate.v2.position.req.V2CultivateCoursePageReq;
import jnpf.model.cultivate.v2.position.vo.V2CultivateJobLearnCourseVo;
import jnpf.model.cultivate.v2.task.req.V2CultivateTaskCountReq;
import jnpf.model.cultivate.v2.task.req.V2CultivateTaskSaveReq;
import jnpf.model.cultivate.v2.task.vo.V2CultivateLearnTaskPhaseVo;
import jnpf.model.cultivate.v2.task.vo.V2CultivateTaskCountExportVo;
import jnpf.model.cultivate.v2.task.vo.V2CultivateTaskCountVo;
import jnpf.model.cultivate.v2.task.vo.V2CultivateTaskDetailsVo;
import jnpf.util.FtbUtil;
import jnpf.util.excel.EasyExcelUtils;
import jnpf.valid.ValidInsert;
import jnpf.valid.ValidUpdate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.validation.groups.Default;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * web培训任务模块
 *
 * @author xgl
 */

@RestController
@Slf4j
@RequestMapping("/v2/web/task")
public class V2CultivateTaskWebController {

    @Autowired
    private V2CultivateTaskService cultivateTaskService;

    @Autowired
    private V2CultivateTaskCountService v2CultivateTaskCountService;

    /**
     * 添加学习任务
     *
     * @param req 学习任务保存请求对象，包含任务的基本信息和配置
     * @return ActionResult<String> 操作结果，包含成功标识和任务ID
     */
    @PostMapping("/add")
    public ActionResult<String> add(@RequestBody @Validated(value = {Default.class, ValidInsert.class}) V2CultivateTaskSaveReq req) {
        return ActionResult.success("成功", cultivateTaskService.add(req));
    }

    /**
     * 编辑学习任务
     *
     * @param req 学习任务保存请求对象，包含需要更新的任务信息
     * @return ActionResult<String> 操作结果，包含成功标识和任务ID
     */
    @PostMapping("/update")
    public ActionResult<String> update(@RequestBody @Validated(value = {Default.class, ValidUpdate.class}) V2CultivateTaskSaveReq req) {
        return ActionResult.success("成功", cultivateTaskService.update(req));
    }


    /**
     * 分配任务给用户
     *
     * @param req 任务分配数据传输对象，包含任务ID和用户分配信息
     * @return ActionResult<Void> 操作结果，仅表示操作是否成功
     */
    @PostMapping("/assign-user")
    public ActionResult<Void> assignUser(@RequestBody @Validated FtbCultivateLearnAllocationDTO req) {
        cultivateTaskService.allocation(req);
        return ActionResult.success("成功");
    }

    /**
     * 中止指定的学习任务
     *
     * @param id 任务主键ID(必传)
     * @return {@link ActionResult } 操作结果，表示任务中止操作的状态
     */
    @PutMapping("/abort-task/{id}")
    public ActionResult<Void> abortTask(@PathVariable("id") String id) {
        cultivateTaskService.abort(id);
        return ActionResult.success();
    }

    /**
     * 删除指定的学习任务
     *
     * @param id 任务主键ID(必传)
     * @return {@link ActionResult } 操作结果，表示任务删除操作的状态
     */
    @DeleteMapping("/delete-task/{id}")
    public ActionResult<Void> deleteTask(@PathVariable("id") String id) {
        cultivateTaskService.deleteTask(id);
        return ActionResult.success();
    }

    /**
     * 根据任务ID获取任务详情，用于编辑页面的数据回显
     *
     * @param id 任务主键ID(必传)
     * @return {@link ActionResult<V2CultivateTaskDetailsVo>} 包含任务详细信息的操作结果
     */
    @GetMapping("/get/{id}")
    public ActionResult<V2CultivateTaskDetailsVo> get(@PathVariable("id") String id) {
        return ActionResult.success(cultivateTaskService.get(id));
    }


    /**
     * 添加岗位学习课程时，岗位学习课程列表
     *
     * @param req
     * @return {@link ActionResult}
     */
    @GetMapping("/query-course-list")
    public ActionResult<PageListVO<V2CultivateJobLearnCourseVo>> positionCourseList(V2CultivateCoursePageReq req) {
        return ActionResult.success(CultivatePage.coverPageList(cultivateTaskService.positionCourseList(req)));
    }

    /**
     * 根据任务id查询我的简单任务详情和阶段列表
     *
     * @param myTaskId 我的任务id
     */
    @GetMapping("/query-user-task-info/{myTaskId}")
    public ActionResult<List<V2CultivateLearnTaskPhaseVo>> queryUserTaskInfo(@PathVariable("myTaskId") String myTaskId) {
        return ActionResult.success("", cultivateTaskService.queryUserTaskInfo(myTaskId));
    }

    /**
     * V2查询任务统计列表
     *
     * @param req 查询请求参数
     * @return 分页统计结果
     */
    @GetMapping("/query-count-list")
    public ActionResult<PageListVO<V2CultivateTaskCountVo>> queryCountList(@Validated V2CultivateTaskCountReq req) {
        PageInfo<V2CultivateTaskCountVo> pageVo = v2CultivateTaskCountService.queryTaskCountList(req);
        return ActionResult.page(pageVo.getList(), FtbUtil.getPagination(pageVo));
    }
    
    /**
     * 导出培训任务统计数据
     *
     * @param req      查询请求参数
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    @GetMapping("/export-count-list")
    public void exportCountList(@Validated V2CultivateTaskCountReq req, HttpServletResponse response) throws IOException {
        // 设置不分页，查询所有数据
        req.setCurrentPage(1);
        req.setPageSize(-1);

        // 直接调用统计服务获取数据
        PageInfo<V2CultivateTaskCountVo> pageVo = v2CultivateTaskCountService.queryTaskCountList(req);
        List<V2CultivateTaskCountVo> list = pageVo.getList();

        // 转换为导出VO
        List<V2CultivateTaskCountExportVo> exportList = convertToExportVo(list);

        // 使用EasyExcel导出
        String fileName = "培训任务统计-" + DateUtil.format(new Date(), "yyyyMMddHHmmss");
        EasyExcelUtils.exportExcel(response, fileName, exportList, V2CultivateTaskCountExportVo.class);
    }

    /**
     * 将统计VO转换为导出VO
     *
     * @param list 统计VO列表
     * @return 导出VO列表
     */
    private List<V2CultivateTaskCountExportVo> convertToExportVo(List<V2CultivateTaskCountVo> list) {
        List<V2CultivateTaskCountExportVo> exportList = new ArrayList<>();
        if (CollUtil.isEmpty(list)) {
            return exportList;
        }

        for (V2CultivateTaskCountVo vo : list) {
            V2CultivateTaskCountExportVo exportVo = new V2CultivateTaskCountExportVo();

            // 基本信息
            exportVo.setTaskName(vo.getTaskName());
            exportVo.setTaskTypeName(convertTaskTypeName(vo.getTaskType()));
            exportVo.setStatusName(convertStatusName(vo.getStatus()));

            // 时间信息
            exportVo.setTimeLimitStartTime(vo.getTimeLimitStartTime() != null ?
                    DateUtil.format(vo.getTimeLimitStartTime(), "yyyy-MM-dd HH:mm:ss") : "-");
            exportVo.setTimeLimitEndTime(vo.getTimeLimitEndTime() != null ?
                    DateUtil.format(vo.getTimeLimitEndTime(), "yyyy-MM-dd HH:mm:ss") : "-");
            exportVo.setCreatorTime(vo.getCreatorTime() != null ?
                    DateUtil.format(vo.getCreatorTime(), "yyyy-MM-dd HH:mm:ss") : "-");

            // 课程数量
            exportVo.setCourseNum(vo.getCourseNum() != null ? vo.getCourseNum() : 0);

            // 考试、鉴定、证书名称（列表转字符串）
            exportVo.setExamNames(collToString(vo.getExamNames()));
            exportVo.setIdentificationNames(collToString(vo.getIdentificationNames()));
            exportVo.setCertificateNames(collToString(vo.getCertificateNames()));

            // 完成率相关
            exportVo.setCompleteCourseRate(vo.getCompleteCourseRate() != null ? vo.getCompleteCourseRate() : "0%");
            exportVo.setExamParticipantCount(vo.getExamParticipantCount() != null ? vo.getExamParticipantCount() : 0);
            exportVo.setExamPassRate(vo.getExamPassRate() != null ? vo.getExamPassRate() : "0%");
            exportVo.setIdentifyParticipantCount(vo.getIdentifyParticipantCount() != null ? vo.getIdentifyParticipantCount() : 0);
            exportVo.setIdentifyPassRate(vo.getIdentifyPassRate() != null ? vo.getIdentifyPassRate() : "0%");

            // 任务完成情况
            exportVo.setAssignedUserCount(vo.getAssignedUserCount() != null ? vo.getAssignedUserCount() : 0);
            exportVo.setCompletedUserCount(vo.getCompletedUserCount() != null ? vo.getCompletedUserCount() : 0);
            exportVo.setTaskCompleteRate(vo.getTaskCompleteRate() != null ? vo.getTaskCompleteRate() : "0%");

            // 证书
            exportVo.setIssuedCertificateCount(vo.getIssuedCertificateCount() != null ? vo.getIssuedCertificateCount() : 0);

            exportList.add(exportVo);
        }

        return exportList;
    }

    /**
     * 转换任务类型名称
     */
    private String convertTaskTypeName(Integer taskType) {
        if (taskType == null) {
            return "-";
        }
        switch (taskType) {
            case 0:
                return "长期";
            case 1:
                return "限时";
            default:
                return "-";
        }
    }

    /**
     * 转换任务状态名称
     */
    private String convertStatusName(Integer status) {
        if (status == null) {
            return "-";
        }
        switch (status) {
            case 0:
                return "未发布";
            case 1:
                return "未开始";
            case 2:
                return "进行中";
            case 3:
                return "已完成";
            case 4:
                return "终止";
            default:
                return "-";
        }
    }

    /**
     * 集合转字符串（用顿号分隔）
     */
    private String collToString(List<String> list) {
        if (CollUtil.isEmpty(list)) {
            return "-";
        }
        return String.join("、", list);
    }

}
