package cn.iocoder.yudao.module.configure.service.materialmanagement;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.configure.controller.admin.materialmanagement.vo.MaterialManagementCreateReqVO;
import cn.iocoder.yudao.module.configure.controller.admin.materialmanagement.vo.MaterialManagementGroupUpdate;
import cn.iocoder.yudao.module.configure.controller.admin.materialmanagement.vo.MaterialManagementPageReqVO;
import cn.iocoder.yudao.module.configure.controller.admin.materialmanagement.vo.MaterialManagementUpdateReqVO;
import cn.iocoder.yudao.module.configure.convert.materialmanagement.MaterialManagementConvert;
import cn.iocoder.yudao.module.configure.dal.dataobject.materialmanagement.MaterialManagementDO;
import cn.iocoder.yudao.module.configure.dal.mysql.materialmanagement.MaterialManagementMapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

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

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

/**
 * 素材管理 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class MaterialManagementServiceImpl implements MaterialManagementService {

    @Resource
    private MaterialManagementMapper materialManagementMapper;

    @Override
    public Boolean createMaterialManagement(List<MaterialManagementCreateReqVO> createReqVO) {
        // 插入
        List<MaterialManagementDO> materialManagements = MaterialManagementConvert.INSTANCE.convertList02(createReqVO);
        materialManagementMapper.insertBatch(materialManagements);
        // 返回
        return Boolean.TRUE;
    }

    @Override
    public void updateMaterialManagement(MaterialManagementUpdateReqVO updateReqVO) {
        // 校验存在
        validateMaterialManagementExists(updateReqVO.getId());
        // 更新
        MaterialManagementDO updateObj = MaterialManagementConvert.INSTANCE.convert(updateReqVO);
        materialManagementMapper.updateById(updateObj);
    }

    @Override
    public void updateMaterialManagementGroupBatch(MaterialManagementGroupUpdate materialManagementGroupUpdate) {
        if (materialManagementMapper.selectBatchIds(materialManagementGroupUpdate.getIds()).size() !=
                materialManagementGroupUpdate.getIds().size()
        ) {
            throw exception(MATERIAL_GROUP_NOT_EXISTS);
        }
        materialManagementMapper.update(null, new LambdaUpdateWrapper<MaterialManagementDO>()
                .set(MaterialManagementDO::getGroupId, materialManagementGroupUpdate.getGroupId())
                .in(MaterialManagementDO::getId, materialManagementGroupUpdate.getIds())
        );
    }

    @Override
    public void deleteMaterialManagement(Long id) {
        // 校验存在
        validateMaterialManagementExists(id);
        // 删除
//        materialManagementMapper.deleteById(id);
        materialManagementMapper.update(null, new LambdaUpdateWrapper<MaterialManagementDO>()
                .set(MaterialManagementDO::getDeleted, 1)
                .eq(MaterialManagementDO::getId, id)
        );
    }

    @Override
    public void deleteMaterialManagementBatch(List<Long> ids) {
        if (materialManagementMapper.selectBatchIds(ids).size() != ids.size()) {
            throw exception(MATERIAL_GROUP_NOT_EXISTS);
        }
        materialManagementMapper.update(null, new LambdaUpdateWrapper<MaterialManagementDO>()
                .set(MaterialManagementDO::getDeleted, 1)
                .in(MaterialManagementDO::getId, ids)
        );
    }

    private void validateMaterialManagementExists(Long id) {
        if (materialManagementMapper.selectById(id) == null) {
            throw exception(MATERIAL_MANAGEMENT_NOT_EXISTS);
        }
    }

    @Override
    public MaterialManagementDO getMaterialManagement(Long id) {
        return materialManagementMapper.selectById(id);
    }

    @Override
    public List<MaterialManagementDO> getMaterialManagementList(Collection<Long> ids) {
        return materialManagementMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<MaterialManagementDO> getMaterialManagementPage(MaterialManagementPageReqVO pageReqVO) {
        return materialManagementMapper.selectPage(pageReqVO);
    }

}
