package com.zt.plat.module.base.service.tmpltp;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zt.plat.framework.tenant.core.aop.TenantIgnore;
import com.zt.plat.module.base.dal.dataobject.tmpltp.TmplInscDatBsnDO;
import com.zt.plat.module.base.dal.dataobject.tmpltp.TmplInscItmBsnDO;
import com.zt.plat.module.base.dal.mysql.tmpltp.TmplInscItmBsnMapper;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

import com.zt.plat.module.base.controller.admin.templtp.vo.*;

import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.pojo.PageParam;
import com.zt.plat.framework.common.util.object.BeanUtils;


import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.framework.common.util.collection.CollectionUtils.convertList;
import static com.zt.plat.framework.common.util.collection.CollectionUtils.diffList;
import static com.zt.plat.module.base.enums.ErrorCodeConstants.*;
import static com.zt.plat.module.tmpltp.enums.ErrorCodeConstants.TMPL_INSC_ITM_BSN_EXISTS;
import static com.zt.plat.module.tmpltp.enums.ErrorCodeConstants.TMPL_INSC_ITM_BSN_NOT_EXISTS;

/**
 * 业务实例条款值 Service 实现类
 *
 * @author 后台管理-1
 */
@Service
@Validated
public class TmplInscItmBsnServiceImpl implements TmplInscItmBsnService {

    @Resource
    private TmplInscItmBsnMapper tmplInscItmBsnMapper;

    @Override
    public TmplInscItmBsnRespVO createTmplInscItmBsn(TmplInscItmBsnSaveReqVO createReqVO) {
        //校验存在
        validateTmplInscItmBsnExistsByKey(createReqVO);
        // 插入
        TmplInscItmBsnDO tmplInscItmBsn = BeanUtils.toBean(createReqVO, TmplInscItmBsnDO.class);
        tmplInscItmBsn.setInscItmId(createReqVO.getInstceItmId());
        tmplInscItmBsnMapper.insert(tmplInscItmBsn);
        // 返回
        return BeanUtils.toBean(tmplInscItmBsn, TmplInscItmBsnRespVO.class);
    }

    void validateTmplInscItmBsnExistsByKey(TmplInscItmBsnSaveReqVO createReqVO) {
        List<TmplInscItmBsnDO> tmplInscItmBsnDOS = tmplInscItmBsnMapper.selectList(TmplInscItmBsnDO::getBsnId, createReqVO.getBsnId(), TmplInscItmBsnDO::getInscItmId, createReqVO.getBsnId());
        if (!tmplInscItmBsnDOS.isEmpty()) {
            throw exception(TMPL_INSC_ITM_BSN_EXISTS);
        }
    }

    @Override
    public void updateTmplInscItmBsn(TmplInscItmBsnSaveReqVO updateReqVO) {
        // 校验存在
        // validateTmplInscItmBsnExists(updateReqVO.getId());
        // 更新
        tmplInscItmBsnMapper.physicalDeleteByBsnIds(List.of(updateReqVO.getBsnId()));
        TmplInscItmBsnDO saveObj = BeanUtils.toBean(updateReqVO, TmplInscItmBsnDO.class);
        saveObj.setInscItmId(updateReqVO.getInstceItmId());
//        tmplInscItmBsnMapper.updateById(updateObj);
        saveObj.setId(null);
        tmplInscItmBsnMapper.insert(saveObj);
    }

    @Override
    public void updateTmplInscItmBsnBatch(List<TmplInscItmBsnSaveReqVO> updateReqVOS) {
        tmplInscItmBsnMapper.physicalDeleteByBsnIds(updateReqVOS.stream().map(TmplInscItmBsnSaveReqVO::getBsnId).toList());
        List<TmplInscItmBsnDO> bean =new ArrayList<>();
        updateReqVOS.forEach(updateReqVO -> {
            TmplInscItmBsnDO tmplInscItmBsnDO = BeanUtils.toBean(updateReqVO, TmplInscItmBsnDO.class);
            tmplInscItmBsnDO.setInscItmId(updateReqVO.getInstceItmId());
            bean.add(tmplInscItmBsnDO);
        });
        tmplInscItmBsnMapper.insertBatch(bean);
    }

    @Override
    public void deleteTmplInscItmBsn(String id) {
        // 校验存在
        validateTmplInscItmBsnExists(id);
        // 删除
        tmplInscItmBsnMapper.deleteById(id);
    }

    @Override
    public void deleteTmplInscItmBsnListByIds(List<Long> ids) {
        // 校验存在
        validateTmplInscItmBsnExists(ids);
        // 删除
        tmplInscItmBsnMapper.deleteByIds(ids);
    }

    private void validateTmplInscItmBsnExists(List<Long> ids) {
        List<TmplInscItmBsnDO> list = tmplInscItmBsnMapper.selectByIds(ids);
        if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
            throw exception(TMPL_INSC_ITM_BSN_NOT_EXISTS);
        }
    }

    private void validateTmplInscItmBsnExists(String id) {
        if (tmplInscItmBsnMapper.selectById(id) == null) {
            throw exception(TMPL_INSC_ITM_BSN_NOT_EXISTS);
        }
    }

    @Override
    public TmplInscItmBsnDO getTmplInscItmBsn(String id) {
        return tmplInscItmBsnMapper.selectById(id);
    }

    @Override
    public PageResult<TmplInscItmBsnDO> getTmplInscItmBsnPage(TmplInscItmBsnPageReqVO pageReqVO) {
        return tmplInscItmBsnMapper.selectPage(pageReqVO);
    }

    @Override
    @TenantIgnore
    public void deleteTmplInscDatBsnListByBsnIds(List<String> ids) {
        tmplInscItmBsnMapper.update(new LambdaUpdateWrapper<TmplInscItmBsnDO>().in(TmplInscItmBsnDO::getBsnId, ids).set(TmplInscItmBsnDO::getDeleted, 1));
    }

    @Override
    public List<TmplInscItmBsnRespVO> getTmplInscItmBsnList(String bsnId) {
        List<TmplInscItmBsnDO> tmplInscItmBsnDOS = tmplInscItmBsnMapper.selectList(TmplInscItmBsnDO::getBsnId, bsnId);
        return BeanUtils.toBean(tmplInscItmBsnDOS, TmplInscItmBsnRespVO.class);
    }

}
