package cn.iocoder.yudao.module.custom.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.custom.entity.CarMain;
import cn.iocoder.yudao.module.custom.mapper.CarMainMapper;
import cn.iocoder.yudao.module.custom.service.CarMainService;
import cn.iocoder.yudao.module.custom.vo.CarMainReqVO;
import cn.iocoder.yudao.module.custom.vo.CarMainRespVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import java.util.List;

/**
 * 车辆信息 Service 实现类
 *
 * @author 后台管理员
 */
@Service
public class CarMainServiceImpl extends ServiceImpl<CarMainMapper, CarMain> implements CarMainService{

    /**
     * 创建车辆信息
     *
     * @param createReqVO 创建信息
     * @return
     */
    @Override
    public CommonResult<String> createCarMain(CarMainReqVO createReqVO) {
        //车牌号license_number，车架号vin，发动机号码engine_number 重复校验
        int checkResult = isDataKeyValueRepeat(createReqVO);
        //如果查重失败
        if (checkResult != 0){
            switch (checkResult){
                case 1: return CommonResult.error(4051,"该车牌号已在系统中登记"); 
                case 2: return CommonResult.error(4052,"该车架号已在系统中登记"); 
                case 3: return CommonResult.error(4053,"该发动机号码已在系统中登记"); 

            }
        }
        // 插入
        CarMain carMain = BeanUtils.toBean(createReqVO, CarMain.class);
        baseMapper.insert(carMain);
        // 返回
        return CommonResult.success("新增成功");
    }

    /**
     * 更新车辆信息
     *
     * @param updateReqVO 更新信息
     */
    @Override
    public CommonResult<String> updateCarMain(CarMainReqVO updateReqVO){
        //车牌号license_number，车架号vin，发动机号码engine_number 重复校验
        int checkResult = isDataKeyValueRepeat(updateReqVO);
        //如果查重失败
        if (checkResult != 0){
            switch (checkResult){
                case 1: return CommonResult.error(4051,"该车牌号已在系统中登记"); 
                case 2: return CommonResult.error(4052,"该车架号已在系统中登记"); 
                case 3: return CommonResult.error(4053,"该发动机号码已在系统中登记"); 

            }
        }
        // 更新
        CarMain updateObj = BeanUtils.toBean(updateReqVO, CarMain.class);
        baseMapper.updateById(updateObj);
        return CommonResult.success("修改成功");
    }

    /**
     * 删除车辆信息
     *
     * @param id 编号
     */
    @Override
    public void deleteCarMain(String id) {
        //判断车辆是否发生过业务
        CarMain target = baseMapper.selectById(id);
        if (ObjectUtil.isEmpty(target.getRecentlyHandledBusiness()) && !"".equals(target.getRecentlyHandledBusiness()) ){

        }
        // 逻辑删除
        baseMapper.deleteById(id);
    }

    /**
     * 获得车辆信息
     *
     * @param id 编号
     * @return
     */
    @Override
    public CarMain getCarMain(String id) {
        //数据单查
        return baseMapper.selectById(id);
    }

    /**
     * 获得车辆信息分页
     *
     * @param pageReqVO 分页查询
     * @return
     */
    @Override
    public IPage<CarMainRespVO> getCarMainPage(CarMainReqVO pageReqVO) {
        //取分页参数
        Page<CarMain> page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize());
        //分页查询
        return baseMapper.findPage(page,pageReqVO);
    }

    /**
     * 车牌号，车架号，发动机号码 查重
     * @param reqVO
     * @return 0无重复，1车牌号重复，2车架号重复，发动机号码重复
     */
    private int isDataKeyValueRepeat(CarMainReqVO reqVO){

        //车牌号license_number 查重
        if(ObjectUtil.isNotEmpty(reqVO.getLicenseNumber())){
            CarMain target = new CarMain();
            target.setLicenseNumber(reqVO.getLicenseNumber());
            List<CarMain> results = baseMapper.isDataKeyValueRepeat(target);
            //判断是否登记过这个车牌号的车辆
            if (results.size()>0){
                //无id是新增，有相应登记记录
                if(ObjectUtil.isEmpty(reqVO.getId()) ){
                    return 1;
                }
                //有id是修改，如果登记过，比较id查验是否是当前要修改的车辆本身
                for (CarMain item: results) {
                    if (!item.getId().equals(reqVO.getId())){
                        return 1;
                    }

                }

            }
            //车架号vin 查重
        }else if (ObjectUtil.isNotEmpty(reqVO.getVin())){
            CarMain target = new CarMain();
            target.setVin(reqVO.getVin());
            List<CarMain> results = baseMapper.isDataKeyValueRepeat(target);
            //判断是否登记过这个车架号的车辆
            if (results.size()>0){
                //无id是新增，有相应登记记录
                if(ObjectUtil.isEmpty(reqVO.getId()) ){
                    return 2;
                }
                //有id是修改，如果登记过，比较id查验是否是当前要修改的车辆本身
                for (CarMain item: results) {
                    if (!item.getId().equals(reqVO.getId())){
                        return 2;
                    }

                }

            }
            //发动机号码engine_number 查重
        }else if (ObjectUtil.isNotEmpty(reqVO.getEngineNumber())){
            CarMain target = new CarMain();
            target.setEngineNumber(reqVO.getEngineNumber());
            List<CarMain> results = baseMapper.isDataKeyValueRepeat(target);
            //判断是否登记过这个发动机号的车辆
            if (results.size()>0){
                //无id是新增，有相应登记记录
                if(ObjectUtil.isEmpty(reqVO.getId()) ){
                    return 3;
                }
                //有id是修改，如果登记过，比较id查验是否是当前要修改的车辆本身
                for (CarMain item: results) {
                    if (!item.getId().equals(reqVO.getId())){
                        return 3;
                    }

                }

            }

        }
        //返回查验无重复结果
        return 0;

    }

}