package cn.ey.biz.module.system.service.field;

import cn.ey.biz.common.pojo.PageResult;
import cn.ey.biz.module.system.controller.admin.field.vo.FieldConfigCreateReqVO;
import cn.ey.biz.module.system.controller.admin.field.vo.FieldConfigExportReqVO;
import cn.ey.biz.module.system.controller.admin.field.vo.FieldConfigPageReqVO;
import cn.ey.biz.module.system.controller.admin.field.vo.FieldConfigUpdateReqVO;
import cn.ey.biz.module.system.convert.field.FieldConfigConvert;
import cn.ey.biz.module.system.dal.dataobject.field.FieldConfigDO;
import cn.ey.biz.module.system.dal.mapper.field.FieldConfigMapper;
import cn.ey.biz.module.system.enums.field.StatusEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import java.util.*;

import static cn.ey.biz.common.exception.util.ServiceExceptionUtil.exception;
import static cn.ey.biz.module.system.enums.ErrorCodeConstants.FIELD_CONFIG_NOT_EXISTS;

/**
 * 字段权限配置 Service 实现类
 *
 */
@Service
@Validated
public class FieldConfigServiceImpl implements FieldConfigService {

    @Resource
    private FieldConfigMapper fieldConfigMapper;

    @Override
    public Long createFieldConfig(FieldConfigCreateReqVO createReqVO) {
        // 插入
        FieldConfigDO fieldConfig = FieldConfigConvert.INSTANCE.convert(createReqVO);
        fieldConfigMapper.insert(fieldConfig);
        // 返回
        return fieldConfig.getId();
    }

    @Override
    public void updateFieldConfig(FieldConfigUpdateReqVO updateReqVO) {
        // 校验存在
        this.validateFieldConfigExists(updateReqVO.getId());
        // 更新
        FieldConfigDO updateObj = FieldConfigConvert.INSTANCE.convert(updateReqVO);
        fieldConfigMapper.updateById(updateObj);
    }

    @Override
    public void deleteFieldConfig(Long id) {
        // 校验存在
        this.validateFieldConfigExists(id);
        // 删除
        fieldConfigMapper.deleteById(id);
    }

    private void validateFieldConfigExists(Long id) {
        if (fieldConfigMapper.selectById(id) == null) {
            throw exception(FIELD_CONFIG_NOT_EXISTS);
        }
    }

    @Override
    public FieldConfigDO getFieldConfig(Long id) {
        return fieldConfigMapper.selectById(id);
    }

    @Override
    public List<FieldConfigDO> getFieldConfigList(Collection<Long> ids) {
        return fieldConfigMapper.selectBatchIds(ids);
    }

    @Override
    public PageResult<FieldConfigDO> getFieldConfigPage(FieldConfigPageReqVO pageReqVO) {
        return fieldConfigMapper.selectPage(pageReqVO);
    }

    @Override
    public List<FieldConfigDO> getFieldConfigList(FieldConfigExportReqVO exportReqVO) {
        return fieldConfigMapper.selectList(exportReqVO);
    }

    @Override
    @Transactional
    public void updateFieldconfigEnable(FieldConfigUpdateReqVO updateReqVO) {

        // 判断是否开启
        if(updateReqVO.getEnable().equals(StatusEnum.ENABLE.getStatus())){
            LambdaUpdateWrapper<FieldConfigDO> updateWrapper = Wrappers.<FieldConfigDO>update()
                    .lambda()
                    .eq(FieldConfigDO::getEnable, StatusEnum.ENABLE.getStatus());
            FieldConfigDO fieldConfigDO = new FieldConfigDO().setEnable(StatusEnum.DISABLE.getStatus());
        // 全部 禁用
            fieldConfigMapper.update(fieldConfigDO,updateWrapper);
        }
        // 根据id开启  or  根据id禁用
        LambdaUpdateWrapper<FieldConfigDO> updateWrapper = Wrappers.<FieldConfigDO>update()
                .lambda()
                .eq(FieldConfigDO::getId, updateReqVO.getId());
        FieldConfigDO fieldConfigDO = new FieldConfigDO().setEnable(updateReqVO.getEnable());
        fieldConfigMapper.update(fieldConfigDO, updateWrapper);
    }

    @Override
    public FieldConfigDO getFieldConfigVersion(String configCode) {
        LambdaQueryWrapper<FieldConfigDO> wrapper = Wrappers.<FieldConfigDO>lambdaQuery()
                .eq(FieldConfigDO::getConfigCode, configCode)
                .eq(FieldConfigDO::getEnable, StatusEnum.ENABLE.getStatus());
        FieldConfigDO fieldConfigDO = fieldConfigMapper.selectOne(wrapper);
        return fieldConfigDO;
    }

}
