package jnpf.cultivate.v2.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jnpf.cultivate.mapper.FtbCultivateTaskLogMapper;
import jnpf.cultivate.v2.service.FtbCultivateTaskLogService;
import jnpf.entity.cultivate.CultivateIdentifyApply;
import jnpf.model.cultivate.po.exam.FtbCultivateExamUser;
import jnpf.model.cultivate.po.task.FtbCultivateTaskLog;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;


@Service
public class FtbCultivateTaskLogServiceImpl extends ServiceImpl<FtbCultivateTaskLogMapper, FtbCultivateTaskLog> implements FtbCultivateTaskLogService {

    /**
     * 根据任务ID、用户ID和阶段ID查询任务日志
     *
     * @param taskId  任务ID
     * @param userId  用户ID
     * @param phaseId 阶段ID
     * @return 任务日志
     */
    @Override
    public FtbCultivateTaskLog getByTaskIdAndUserIdAndPhaseId(String taskId, String userId, String phaseId) {
        LambdaQueryWrapper<FtbCultivateTaskLog> logWrapper = new LambdaQueryWrapper<>();
        logWrapper.eq(FtbCultivateTaskLog::getTaskId, taskId)
                .eq(FtbCultivateTaskLog::getUserId, userId)
                .eq(FtbCultivateTaskLog::getPhaseId, phaseId)
                .eq(FtbCultivateTaskLog::getEnabledMark, 0);
        return getOne(logWrapper);
    }

    /**
     * 查询用户已完成的阶段
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 已完成的阶段列表
     */
    @Override
    public List<FtbCultivateTaskLog> queryCompleteTaskPhase(String taskId, String userId) {
        LambdaQueryWrapper<FtbCultivateTaskLog> logWrapper = new LambdaQueryWrapper<>();
        logWrapper.eq(FtbCultivateTaskLog::getTaskId, taskId)
                .eq(FtbCultivateTaskLog::getUserId, userId)
                .eq(FtbCultivateTaskLog::getState, 2)
                .eq(FtbCultivateTaskLog::getEnabledMark, 0);
        return baseMapper.selectList(logWrapper);
    }

    /**
     * 保存或更新任务日志
     *
     * @param userId  用户ID
     * @param taskId  任务ID
     * @param phaseId 阶段ID
     */
    @Override
    public void saveOrUpdateByCondition(String userId, String taskId, String phaseId, Integer issuedCertificate) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            if (ftbCultivateTaskLog.getState().equals(2)) {
                return;
            }
            ftbCultivateTaskLog.setIssuedCertificate(issuedCertificate);
            ftbCultivateTaskLog.setState(2);
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setIssuedCertificate(issuedCertificate);
            ftbCultivateTaskLog.setState(2);
            baseMapper.insert(ftbCultivateTaskLog);
        }
    }

    /**
     * 批量查询用户已完成的阶段
     *
     * @param taskIds 任务ID列表
     * @param userId  用户ID
     * @return 已完成的阶段列表
     */
    @Override
    public List<FtbCultivateTaskLog> batchQueryCompleteTaskPhase(List<String> taskIds, String userId) {
        LambdaQueryWrapper<FtbCultivateTaskLog> logWrapper = new LambdaQueryWrapper<>();
        logWrapper.in(FtbCultivateTaskLog::getTaskId, taskIds)
                .eq(FtbCultivateTaskLog::getUserId, userId)
                .eq(FtbCultivateTaskLog::getState, 2)
                .eq(FtbCultivateTaskLog::getEnabledMark, 0);
        List<FtbCultivateTaskLog> ftbCultivateTaskLogs = baseMapper.selectList(logWrapper);
        if (CollUtil.isEmpty(ftbCultivateTaskLogs)) {
            return new ArrayList<>();
        }
        return ftbCultivateTaskLogs;
    }

    /**
     * 保存课程任务阶段
     *
     * @param userId  用户ID
     * @param taskId  任务ID
     * @param phaseId 阶段ID
     * @param state   阶段状态
     */
    @Override
    public void saveCourseTaskPhase(String userId, String taskId, String phaseId, Integer state) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            if (ftbCultivateTaskLog.getCourseState().equals(1)) {
                return;
            }
            ftbCultivateTaskLog.setCourseState(state);
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setCourseState(state);
            baseMapper.insert(ftbCultivateTaskLog);
        }

    }

    /**
     * 保存考试任务阶段
     *
     * @param userId  用户ID
     * @param taskId  任务ID
     * @param phaseId 阶段ID
     * @param state   阶段状态
     */
    @Override
    public void saveExamTaskPhase(String userId, String taskId, String phaseId, Integer state, FtbCultivateExamUser examUser) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            if (ftbCultivateTaskLog.getExamState().equals(1)) {
                return;
            }
            ftbCultivateTaskLog.setExamState(state);
            if (examUser != null) {
                ftbCultivateTaskLog.setExamResult(examUser.getStatus());
            }
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setExamState(state);
            if (examUser != null) {

                ftbCultivateTaskLog.setExamResult(examUser.getStatus());
                ftbCultivateTaskLog.setUserExamId(examUser.getId());
            }
            baseMapper.insert(ftbCultivateTaskLog);
        }

    }

    /**
     * practice任务阶段
     *
     * @param userId  用户ID
     * @param taskId  任务ID
     * @param phaseId 阶段ID
     * @param state   阶段状态
     */
    @Override
    public void savePracticeTaskPhase(String userId, String taskId, String phaseId, Integer state) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            if (ftbCultivateTaskLog.getPracticeState().equals(1)) {
                return;
            }
            ftbCultivateTaskLog.setPracticeState(state);
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setPracticeState(state);
            baseMapper.insert(ftbCultivateTaskLog);
        }

    }

    /**
     * 身份证任务阶段
     *
     * @param userId  用户ID
     * @param taskId  任务ID
     * @param phaseId 阶段ID
     * @param state   阶段状态
     */
    @Override
    public void saveIdentificationTaskPhase(String userId, String taskId, String phaseId, Integer state, CultivateIdentifyApply cultivateIdentifyApply) {

        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            if (ftbCultivateTaskLog.getIdentifyState().equals(1)) {
                return;
            }
            ftbCultivateTaskLog.setIdentifyState(state);
            if (cultivateIdentifyApply != null) {
                ftbCultivateTaskLog.setIdentifyResult(cultivateIdentifyApply.getStatus());
                ftbCultivateTaskLog.setUserIdentifyId(cultivateIdentifyApply.getId());
            }
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setIdentifyState(state);
            if (cultivateIdentifyApply != null) {
                ftbCultivateTaskLog.setIdentifyResult(cultivateIdentifyApply.getStatus());
                ftbCultivateTaskLog.setUserIdentifyId(cultivateIdentifyApply.getId());
            }
            baseMapper.insert(ftbCultivateTaskLog);
        }

    }

    @Override
    public void checkAndSetTaskPhaseStart(String userId, String taskId, String phaseId) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            if (ftbCultivateTaskLog.getState().equals(1)) {
                return;
            }
            ftbCultivateTaskLog.setState(1);
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setState(1);
            baseMapper.insert(ftbCultivateTaskLog);
        }
    }

    /**
     * 保存考试结果状态
     *
     * @param userId     用户 ID
     * @param taskId     任务 ID
     * @param phaseId    阶段 ID
     * @param examResult 考试结果状态（-1-未配置 0-待考试 1-待批阅 2-已逾期 3-合格 4-不合格 5-优秀）
     */
    @Override
    public void saveExamResultState(String userId, String taskId, String phaseId, Integer examResult) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            ftbCultivateTaskLog.setExamResult(examResult);
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setExamResult(examResult);
            baseMapper.insert(ftbCultivateTaskLog);
        }
    }

    /**
     * 保存鉴定结果状态
     *
     * @param userId         用户 ID
     * @param taskId         任务 ID
     * @param phaseId        阶段 ID
     * @param identifyResult 鉴定结果状态（-1-未配置 0-合格 1-优秀 2-不合格）
     */
    @Override
    public void saveIdentifyResultState(String userId, String taskId, String phaseId, Integer identifyResult) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            ftbCultivateTaskLog.setIdentifyResult(identifyResult);
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setIdentifyResult(identifyResult);
            baseMapper.insert(ftbCultivateTaskLog);
        }
    }

    /**
     * 保存用户考试ID
     *
     * @param userId     用户 ID
     * @param taskId     任务 ID
     * @param phaseId    阶段 ID
     * @param userExamId 用户考试ID
     */
    @Override
    public void saveUserExamId(String userId, String taskId, String phaseId, String userExamId) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            ftbCultivateTaskLog.setUserExamId(userExamId);
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setUserExamId(userExamId);
            baseMapper.insert(ftbCultivateTaskLog);
        }
    }

    /**
     * 保存用户鉴定ID
     *
     * @param userId         用户 ID
     * @param taskId         任务 ID
     * @param phaseId        阶段 ID
     * @param userIdentifyId 用户鉴定ID
     */
    @Override
    public void saveUserIdentifyId(String userId, String taskId, String phaseId, String userIdentifyId) {
        List<FtbCultivateTaskLog> taskLogList = queryTaskPhaseLogs(userId, taskId, phaseId);
        if (CollUtil.isNotEmpty(taskLogList)) {
            FtbCultivateTaskLog ftbCultivateTaskLog = taskLogList.get(0);
            ftbCultivateTaskLog.setUserIdentifyId(userIdentifyId);
            this.updateById(ftbCultivateTaskLog);
        } else {
            FtbCultivateTaskLog ftbCultivateTaskLog = new FtbCultivateTaskLog();
            ftbCultivateTaskLog.setTaskId(taskId);
            ftbCultivateTaskLog.setUserId(userId);
            ftbCultivateTaskLog.setPhaseId(phaseId);
            ftbCultivateTaskLog.setUserIdentifyId(userIdentifyId);
            baseMapper.insert(ftbCultivateTaskLog);
        }
    }

    public List<FtbCultivateTaskLog> queryTaskPhaseLogs(String userId, String taskId, String phaseId) {
        LambdaQueryWrapper<FtbCultivateTaskLog> logWrapper = new LambdaQueryWrapper<>();
        logWrapper.eq(FtbCultivateTaskLog::getTaskId, taskId)
                .eq(FtbCultivateTaskLog::getUserId, userId)
                .eq(FtbCultivateTaskLog::getPhaseId, phaseId)
                .eq(FtbCultivateTaskLog::getEnabledMark, 0);
        return baseMapper.selectList(logWrapper);
    }
}