package com.jojubanking.boot.module.system.service.xymain;

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import java.util.*;
import com.jojubanking.boot.module.system.controller.admin.xymain.vo.*;
import com.jojubanking.boot.module.system.dal.dataobject.xymain.xyMainDO;
import com.jojubanking.boot.framework.common.pojo.PageResult;

import com.jojubanking.boot.module.system.convert.xymain.xyMainConvert;
import com.jojubanking.boot.module.system.dal.mysql.xymain.xyMainMapper;

import static com.jojubanking.boot.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.jojubanking.boot.module.system.enums.ErrorCodeConstants.*;

/**
 * 体检信息 Service 实现类
 *
 * @author admin
 */
@Service
@Validated
public class xyMainServiceImpl implements xyMainService {

    @Resource
    private xyMainMapper xyMainMapper;

    @Override
    public Long createxyMain(xyMainCreateReqVO createReqVO) {
        //每个身份证只能一条记录
        if(validateNationid(createReqVO.getNationId()) >= 1){
            throw exception(XY_MAIN_NATIONID_EXISTS);
        }

        //如果新增的是默认体检人，把openid下的其他用户重置
        if(createReqVO.getDefaultflag() == 0){

            UpdateWrapper<xyMainDO> updateWrapper = Wrappers.update();

            updateWrapper.eq("openid", createReqVO.getOpenid());
            xyMainDO xyMainDO = new xyMainDO();
            xyMainDO.setDefaultflag(Long.getLong("1"));

            int update = xyMainMapper.update(xyMainDO, updateWrapper);

        }

        // 插入
        xyMainDO xyMain = xyMainConvert.INSTANCE.convert(createReqVO);
        xyMainMapper.insert(xyMain);

        //检查是否是某位家长的第一体检人
        xyMainExportReqVO checkVO = new xyMainExportReqVO();
        checkVO.setOpenid(createReqVO.getOpenid());
        List<xyMainDO> list = getxyMainListSimple(checkVO);

        if(list.size() == 1){
            //新增1条记录，默认为默认就诊人
            UpdateWrapper<xyMainDO> updateWrapper = Wrappers.update();

            updateWrapper.eq("openid", createReqVO.getOpenid());
            xyMainDO xyDO = new xyMainDO();
            xyDO.setDefaultflag(0L);

            int update = xyMainMapper.update(xyDO, updateWrapper);
        }

        // 返回
        return xyMain.getId();
    }

    @Override
    public void updatexyMain(xyMainUpdateReqVO updateReqVO) {
        //已有缴费记录不允许修改
        if(validateFeeflag(updateReqVO.getId())){
            throw exception(XY_MAIN_FEE_EXISTS);
        }
        // 校验存在
        this.validatexyMainExists(updateReqVO.getId());

        //如果新增的是默认体检人，把openid下的其他用户重置
        if(updateReqVO.getDefaultflag() == 0){

            UpdateWrapper<xyMainDO> updateWrapper = Wrappers.update();

            updateWrapper.eq("openid", updateReqVO.getOpenid());
            xyMainDO xyMainDO = new xyMainDO();
            xyMainDO.setDefaultflag(1L);

            int update = xyMainMapper.update(xyMainDO, updateWrapper);

        }

        // 更新
        xyMainDO updateObj = xyMainConvert.INSTANCE.convert(updateReqVO);
        xyMainMapper.updateById(updateObj);

        //如果新增的是默认体检人，把openid下的其他用户重置

    }

    @Override
    public void deletexyMain(Long id) {
        ////已有缴费记录不允许删除
        if(validateFeeflag(id)){
            throw exception(XY_MAIN_FEE_EXISTS);
        }

        // 校验存在
        this.validatexyMainExists(id);
        // 删除
        xyMainMapper.deleteById(id);
    }

    private void validatexyMainExists(Long id) {
        if (xyMainMapper.selectById(id) == null) {
            throw exception(XY_MAIN_NOT_EXISTS);
        }
    }

    private int validateNationid(String nationid) {
        xyMainExportReqVO reqVO = new xyMainExportReqVO();
        reqVO.setNationId(nationid);
        List<xyMainDO> lst = xyMainMapper.selectList(reqVO);
        if(lst.size() > 1) return 2;
        else if(lst.size() == 1) return 1;
        else return 0;
    }
    private boolean validateFeeflag(Long id) {
        xyMainDO reqVO = new xyMainDO();

        if (xyMainMapper.selectById(id) == null) {
            throw exception(XY_MAIN_NOT_EXISTS);
        }

        reqVO = xyMainMapper.selectById(id);

        if(reqVO.getFeeflag() == 0) return false;
        else return true;
    }

    @Override
    public xyMainDO getxyMain(Long id) {
        return xyMainMapper.selectById(id);
    }

    @Override
    public List<xyMainDO> getxyMainList(Collection<Long> ids) {
        return xyMainMapper.selectBatchIds(ids);
    }

    @Override
    public List<xyMainDO> getxyMainListSimple(xyMainExportReqVO reqVO) {
        return xyMainMapper.selectListSimple(reqVO);
    }

    @Override
    public PageResult<xyMainDO> getxyMainPage(xyMainPageReqVO pageReqVO) {
        return xyMainMapper.selectPage(pageReqVO);
    }

    @Override
    public List<xyMainDO> getxyMainList(xyMainExportReqVO exportReqVO) {
        return xyMainMapper.selectList(exportReqVO);
    }

}
