package digital.laboratory.platform.entrustment.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import digital.laboratory.platform.common.mybatis.security.service.DLPUser;
import digital.laboratory.platform.common.security.util.SecurityUtils;
import digital.laboratory.platform.entrustment.dto.EntrustAlterApplyApproveDTO;
import digital.laboratory.platform.entrustment.dto.EntrustAlterApplyDTO;
import digital.laboratory.platform.entrustment.entity.EntrustAlterApply;
import digital.laboratory.platform.entrustment.enums.EntrustAlterApplyStatus;
import digital.laboratory.platform.entrustment.query.EntrustAlterApplyQuery;
import digital.laboratory.platform.entrustment.service.CommonFeignService;
import digital.laboratory.platform.entrustment.service.EntrustAlterApplyService;
import digital.laboratory.platform.entrustment.mapper.EntrustAlterApplyMapper;
import digital.laboratory.platform.entrustment.vo.EntrustAlterApplyVO;
import digital.laboratory.platform.sys.feign.RemoteUserService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author ChenJiangBao
* @description 针对表【b_entrust_alter_apply(申请修改委托消息表)】的数据库操作Service实现
* @createDate 2024-10-31 17:35:01
*/
@Service
public class EntrustAlterApplyServiceImpl extends ServiceImpl<EntrustAlterApplyMapper, EntrustAlterApply>
    implements EntrustAlterApplyService{

    @Resource
    private CommonFeignService commonFeignService;


    @Override
    public IPage<EntrustAlterApplyVO> voPage(EntrustAlterApplyQuery query) {
        DLPUser user = SecurityUtils.getUser();
        if (!user.isStaff()) {
            query.setClientOrgId(user.getOrgId());
            query.setIsStaff(false);
        }
        IPage<EntrustAlterApplyVO> entrustAlterApplyVOPage = baseMapper.getEntrustAlterApplyVOPage(new Page<>(query.getCurrent(), query.getSize()), query);
        entrustAlterApplyVOPage.getRecords().forEach(e -> {
            fillVOInfo(e);
        });
        return entrustAlterApplyVOPage;
    }

    /**
     * 保存消息
     * @param dto
     * @return
     */
    @Override
    public EntrustAlterApplyVO save(EntrustAlterApplyDTO dto) {
        // 对当前委托进行校验，如果有关联该委托的申请信息，判断状态如果不是已完成则提示先完成当前申请
        List<EntrustAlterApply> preApplyInfo = super.list(Wrappers.<EntrustAlterApply>lambdaQuery().eq(EntrustAlterApply::getEntrustId, dto.getEntrustId()));
        if (CollUtil.isNotEmpty(preApplyInfo)) {
            List<EntrustAlterApply> unfinishedList = preApplyInfo.stream().filter(e -> !e.getStatus().equals(EntrustAlterApplyStatus.FINISHED.getStatus())).collect(Collectors.toList());
            if (CollUtil.isNotEmpty(unfinishedList)) {
                throw new RuntimeException("该委托存在未完成的申请信息，请先完成其他申请后再进行申请修改！");
            }
        }

        EntrustAlterApply entrustAlterApply = new EntrustAlterApply();
        if (StrUtil.isBlank(dto.getId())) {
            entrustAlterApply.setEntrustId(dto.getEntrustId());
            DLPUser user = SecurityUtils.getUser();
            entrustAlterApply.setApplicant(user.getId());
            entrustAlterApply.setApplyOrgId(user.getOrgId());
            entrustAlterApply.setApplyReason(dto.getApplyReason());
            if (dto.getOpCode() == 0) {
                entrustAlterApply.setStatus(EntrustAlterApplyStatus.WAIT_SUBMIT_APPLY.getStatus());
            } else if (dto.getOpCode() == 1) {
                entrustAlterApply.setApplyDate(LocalDate.now());
                entrustAlterApply.setStatus(EntrustAlterApplyStatus.SUBMITTED_WAIT_APPROVE.getStatus());
            }
            super.save(entrustAlterApply);
        } else {
            entrustAlterApply.setId(dto.getId());
            super.update(Wrappers.<EntrustAlterApply>lambdaUpdate()
                    .eq(EntrustAlterApply::getId, dto.getId())
                    .set(EntrustAlterApply::getStatus, EntrustAlterApplyStatus.SUBMITTED_WAIT_APPROVE.getStatus())
                    .set(EntrustAlterApply::getApplyDate, LocalDate.now()));

        }
        EntrustAlterApplyVO entrustAlterApplyVOOne = baseMapper.getEntrustAlterApplyVOOne(Wrappers.<EntrustAlterApply>lambdaQuery().eq(EntrustAlterApply::getId, entrustAlterApply.getId()));
        fillVOInfo(entrustAlterApplyVOOne);
        return entrustAlterApplyVOOne;
    }

    @Override
    public Boolean approve(EntrustAlterApplyApproveDTO approveDTO) {
        if (approveDTO.getOpCode() == 0) {
            // 拒绝
            return super.update(Wrappers.<EntrustAlterApply>lambdaUpdate().eq(EntrustAlterApply::getId, approveDTO.getId())
                    .set(EntrustAlterApply::getStatus, EntrustAlterApplyStatus.APPLY_FAIL.getStatus())
                    .set(EntrustAlterApply::getReason,approveDTO.getReason()));
        } else {
            // 同意
            return super.update(Wrappers.<EntrustAlterApply>lambdaUpdate().eq(EntrustAlterApply::getId, approveDTO.getId())
                    .set(EntrustAlterApply::getStatus, EntrustAlterApplyStatus.APPLY_SUCCESS.getStatus())
                    .set(EntrustAlterApply::getReason,approveDTO.getReason()));
        }
    }

    /**
     * 修改消息
     * @param dto
     * @return
     */
    @Override
    public Boolean update(EntrustAlterApplyDTO dto) {
        if(StrUtil.isBlank(dto.getId())){
            throw new RuntimeException("修改的记录id不能为空");
        }
        EntrustAlterApply oldInfo = super.getById(dto.getId());
        if (dto.getOpCode() == 1 && oldInfo.getStatus().equals(EntrustAlterApplyStatus.SUBMITTED_WAIT_APPROVE.getStatus())) {
            throw new RuntimeException("该条记录不在可撤销的状态范围内!");
        }
        return super.update(Wrappers.<EntrustAlterApply>lambdaUpdate().eq(EntrustAlterApply::getId, dto.getId())
                .set(EntrustAlterApply::getEntrustId, dto.getEntrustId())
                .set(StrUtil.isNotBlank(dto.getApplyReason()), EntrustAlterApply::getApplyReason, dto.getApplyReason())
                .set(dto.getOpCode() == 1,
                        EntrustAlterApply::getStatus, EntrustAlterApplyStatus.WAIT_SUBMIT_APPLY.getStatus()));
    }

    /**
     * 删除委托申请修改消息
     * @param ids
     * @return
     */
    @Override
    public Boolean delete(List<String> ids) {
        List<EntrustAlterApplyVO> entrustAlterAppliesVOS = baseMapper.getEntrustAlterApplyVOList(Wrappers.<EntrustAlterApply>lambdaQuery().in(EntrustAlterApply::getId,ids));
        entrustAlterAppliesVOS.forEach(e -> {
            if (e.getStatus().equals(EntrustAlterApplyStatus.WAIT_SUBMIT_APPLY.getStatus())) {
                throw new RuntimeException(String.format("案件名称为 %s 的记录不在可删除的状态，无法删除!", e.getCaseName()));
            }
        });
        return super.remove(Wrappers.<EntrustAlterApply>lambdaUpdate().in(EntrustAlterApply::getId,ids));
    }

    /**
     * 填充VO信息
     * @param e
     */
    private void fillVOInfo(EntrustAlterApplyVO e) {
        e.setStatusName(EntrustAlterApplyStatus.fromStatus(e.getStatus()).getDesc());
        e.setApplicantName(commonFeignService.remoteGetUserById(e.getApplicant()).getName());
        e.setReviewerName(commonFeignService.remoteGetUserById(e.getReviewer()).getName());
        e.setApplyOrgName(commonFeignService.remoteGetSysOrg(e.getApplyOrgId()).getName());
    }
}




