package com.jsowell.pile.service.impl;

import com.alibaba.fastjson2.JSON;
import com.jsowell.common.constant.UserConstants;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.StringUtils;
import com.jsowell.pile.domain.MemberPlateNumberRelation;
import com.jsowell.pile.mapper.MemberPlateNumberRelationMapper;
import com.jsowell.pile.service.IMemberPlateNumberRelationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Locale;

/**
 * 用户车牌对应关系Service业务层处理
 *
 * @author jsowell
 * @date 2023-03-06
 */
@Slf4j
@Service
public class MemberPlateNumberRelationServiceImpl implements IMemberPlateNumberRelationService {
    @Autowired
    private MemberPlateNumberRelationMapper memberPlateNumberRelationMapper;

    /**
     * 查询用户车牌对应关系
     *
     * @param id 用户车牌对应关系主键
     * @return 用户车牌对应关系
     */
    @Override
    public MemberPlateNumberRelation selectMemberPlateNumberRelationById(Integer id) {
        return memberPlateNumberRelationMapper.selectMemberPlateNumberRelationById(id);
    }

    /**
     * 查询用户车牌对应关系列表
     *
     * @param memberPlateNumberRelation 用户车牌对应关系
     * @return 用户车牌对应关系
     */
    @Override
    public List<MemberPlateNumberRelation> selectMemberPlateNumberRelationList(MemberPlateNumberRelation memberPlateNumberRelation) {
        return memberPlateNumberRelationMapper.selectMemberPlateNumberRelationList(memberPlateNumberRelation);
    }

    /**
     * 新增用户车牌对应关系
     *
     * @param memberPlateNumberRelation 用户车牌对应关系
     * @return 结果
     */
    @Override
    public int insertMemberPlateNumberRelation(MemberPlateNumberRelation memberPlateNumberRelation) {
        return memberPlateNumberRelationMapper.insertMemberPlateNumberRelation(memberPlateNumberRelation);
    }

    /**
     * 修改用户车牌对应关系
     *
     * @param memberPlateNumberRelation 用户车牌对应关系
     * @return 结果
     */
    @Override
    public int updateMemberPlateNumberRelation(MemberPlateNumberRelation memberPlateNumberRelation) {
        return memberPlateNumberRelationMapper.updateMemberPlateNumberRelation(memberPlateNumberRelation);
    }

    @Override
    public int updatePlateNumber(MemberPlateNumberRelation memberPlateNumberRelation) {
        String licensePlateNumber = memberPlateNumberRelation.getLicensePlateNumber();
        if (StringUtils.isNotBlank(licensePlateNumber)) {
            // 判断当前车牌号是否被绑定
            if (UserConstants.NOT_UNIQUE.equals(checkPlateNumberUnique(licensePlateNumber))) {
                // 不为空说明该用户绑定过此车牌号
                throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARNO_HAS_BEEN_BINDING);
            }
            String plateNumber = licensePlateNumber.toUpperCase(Locale.ROOT);
            memberPlateNumberRelation.setLicensePlateNumber(plateNumber);
        }

        // 校验vin
        String vinCode = memberPlateNumberRelation.getVinCode();
        if (StringUtils.isNotBlank(vinCode)) {
            // 判断当前vin是否被绑定
            if (UserConstants.NOT_UNIQUE.equals(checkVinCodeUnique(vinCode))) {
                throw new BusinessException(ReturnCodeEnum.CODE_THIS_VIN_HAS_BEEN_BINDING);
            }
        }
        return memberPlateNumberRelationMapper.updateMemberPlateNumberRelation(memberPlateNumberRelation);
    }

    // /**
    //  * 批量删除用户车牌对应关系
    //  *
    //  * @param ids 需要删除的用户车牌对应关系主键
    //  * @return 结果
    //  */
    // @Override
    // public int deleteMemberLicensePlateNumberRelationByIds(Integer[] ids) {
    //     return memberLicensePlateNumberRelationMapper.deleteMemberLicensePlateNumberRelationByIds(ids);
    // }
    //
    // /**
    //  * 删除用户车牌对应关系信息
    //  *
    //  * @param id 用户车牌对应关系主键
    //  * @return 结果
    //  */
    // @Override
    // public int deleteMemberLicensePlateNumberRelationById(Integer id) {
    //     return memberLicensePlateNumberRelationMapper.deleteMemberLicensePlateNumberRelationById(id);
    // }

    /**
     * 用户解除绑定车牌号（逻辑删除，将 del_flag 改为 1）
     *
     * @param dto
     * @return
     */
    @Override
    public int deleteCarNoByParams(List<Integer> ids){
        return memberPlateNumberRelationMapper.deleteCarNoByParams(ids);
    }

    @Override
    public int unbindingPlateNumber(String memberId, String plateNumber) {
        return memberPlateNumberRelationMapper.unbindingPlateNumber(memberId, plateNumber);
    }

    /**
     * 通过vin码查询信息
     * @param vinCode
     * @return
     */
    @Override
    public MemberPlateNumberRelation getMemberPlateInfoByVinCode(String vinCode) {
        if (StringUtils.isBlank(vinCode)) {
            return null;
        }
        vinCode = vinCode.trim();
        MemberPlateNumberRelation plateInfo = memberPlateNumberRelationMapper.queryByVinCode(vinCode);
        log.info("通过vin码查询数据库绑定用户信息 vinCode:{}, result:{}", vinCode, JSON.toJSONString(plateInfo));
        return plateInfo;
    }

    /**
     * 校验vin唯一
     * @param vinCode
     * @return
     */
    @Override
    public String checkVinCodeUnique(String vinCode) {
        MemberPlateNumberRelation info = memberPlateNumberRelationMapper.queryByVinCode(vinCode);
        if (info == null) {
            return UserConstants.UNIQUE;
        }
        return UserConstants.NOT_UNIQUE;
    }

    /**
     * 校验车牌号唯一
     */
    @Override
    public String checkPlateNumberUnique(String plateNumber) {
        MemberPlateNumberRelation info = memberPlateNumberRelationMapper.queryByPlateNumber(plateNumber);
        if (info == null) {
            return UserConstants.UNIQUE;
        }
        return UserConstants.NOT_UNIQUE;
    }
}
