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

import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.conf.entity.BaseType;
import cn.iocoder.yudao.module.conf.mapper.BaseTypeMapper;
import cn.iocoder.yudao.module.conf.service.BaseTypeService;
import cn.iocoder.yudao.module.conf.vo.BaseTypeListReqVO;
import cn.iocoder.yudao.module.conf.vo.BaseTypeRespVO;
import cn.iocoder.yudao.module.conf.vo.BaseTypeSaveReqVO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

import static cn.iocoder.yudao.common.ErrorCodeConstants.*;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;

/**
 * 配置类型 Service 实现类
 *
 * @author pqz
 */
@Service
@Validated
public class BaseTypeServiceImpl extends ServiceImpl<BaseTypeMapper, BaseType> implements BaseTypeService {

    @Resource
    private BaseTypeMapper baseTypeMapper;

    /**
     * 新增账目配置类型
     *
     * @param saveReqVO BaseTypeSaveReqVO实体
     * @author PQZ
     * @date 11:23 2024/9/10
     **/
    @Override
    public void saveBaseType(BaseTypeSaveReqVO saveReqVO) {
        /*1、数据校验*/
        //同级别下校验名称是否重复
        validateBaseTypeNameUnique(saveReqVO.getId(), saveReqVO.getParentId(), saveReqVO.getType(), saveReqVO.getName(), saveReqVO.getCode());
        /*2、数据保存*/
        //类型转换
        BaseType baseType = BeanUtils.toBean(saveReqVO, BaseType.class);
        //数据保存
        saveOrUpdate(baseType);
    }

    /**
     * 删除配置类型
     *
     * @param id 配置类型id
     * @author PQZ
     * @date 17:07 2024/9/10
     **/
    @Override
    public void deleteBaseType(String id) {
        // 校验是否有子配置类型
        LambdaQueryWrapper<BaseType> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(BaseType::getParentId, id);
        List<BaseType> list = list(lambdaQueryWrapper);
        if (list.size() > 0) {
            throw exception(BASE_TYPE_EXITS_CHILDREN);
        }
        // 删除
        baseTypeMapper.deleteById(id);
    }


    /**
     * 同类型，同级别下校验名称唯一性
     *
     * @param id       id
     * @param parentId 父类id
     * @param type     配置类型
     * @param name     名称
     * @param code     编码
     * @author PQZ
     * @date 11:34 2024/9/10
     **/
    private void validateBaseTypeNameUnique(String id, String parentId, String type, String name, String code) {
        //配置类型不能为空
        if (StringUtils.isBlank(type)) {
            throw exception(BASE_TYPE_NOT_EXISTS);
        }
        LambdaQueryWrapper<BaseType> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(BaseDO::getDeleted, 0)
                .eq(BaseType::getType, type)
                .eq(BaseType::getName, name)
                .eq(BaseType::getCode, code)
                .eq(BaseType::getParentId, parentId);
        //id存在为编辑情况,排除自身
        if (null != id) {
            lambdaQueryWrapper.ne(BaseType::getId, id);
        }
        //查询list，校验唯一性
        List<BaseType> list = list(lambdaQueryWrapper);
        if (list.size() > 0) {
            throw exception(BASE_TYPE_NAME_DUPLICATE);
        }
    }

    /**
     * 根据类型id查询配置类型
     *
     * @param id 类型id
     * @return cn.iocoder.yudao.module.conf.entity.BaseType
     * @author PQZ
     * @date 14:40 2024/9/10
     **/
    @Override
    public BaseTypeRespVO getBaseType(String id) {
        BaseType baseType = getById(id);
        BaseTypeRespVO result = BeanUtils.toBean(baseType, BaseTypeRespVO.class);
        //关联子公司转换
        if (StringUtils.isNotBlank(result.getCorpId())) {
            result.setCorpIds(Arrays.asList(result.getCorpId().split(",")));
        }
        return result;
    }

    /**
     * 获取配置类型列表
     *
     * @param listReqVO BaseTypeListReqVO
     * @return java.util.List<cn.iocoder.yudao.module.conf.entity.BaseType>
     * @author PQZ
     * @date 14:27 2024/9/10
     **/
    @Override
    public List<BaseTypeRespVO> getBaseTypeList(BaseTypeListReqVO listReqVO) {
        return baseTypeMapper.queryList(listReqVO);
    }

    /**
     * 查看列表，或服务、或项目、或配件
     * 根据需要的type和对应的企业
     *
     * @author 小李
     * @date 14:29 2024/9/23
     * @param baseType 查询条件
     **/
    @Deprecated // 写错了，先弃用
    @Override
    public List<BaseType> getListByTypeAndCorpId(BaseType baseType){
        return baseTypeMapper.getListByTypeAndCorpId(baseType);
    }

}