package com.ruoyi.cs.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.cs.domain.CsAchievementInfoDetails;
import com.ruoyi.cs.domain.dto.CsAccountExtensionInfoDTO;
import com.ruoyi.cs.domain.vo.CsAccountExtensionInfoVO;
import com.ruoyi.cs.domain.vo.CsAchievementReservationDetailsVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.cs.mapper.CsAccountExtensionInfoMapper;
import com.ruoyi.cs.domain.CsAccountExtensionInfo;
import com.ruoyi.cs.service.ICsAccountExtensionInfoService;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;

/**
 * 账户延期人员信息Service业务层处理
 *
 * @author ruoyi
 * @date 2024-08-09
 */
@Service
public class CsAccountExtensionInfoServiceImpl implements ICsAccountExtensionInfoService
{
    @Resource
    private CsAccountExtensionInfoMapper csAccountExtensionInfoMapper;

    /**
     * 查询账户延期人员信息
     *
     * @param accountExtensionInfoId 账户延期人员信息主键
     * @return 账户延期人员信息
     */
    @Override
    public CsAccountExtensionInfo selectCsAccountExtensionInfoByAccountExtensionInfoId(String accountExtensionInfoId)
    {
        return csAccountExtensionInfoMapper.selectCsAccountExtensionInfoByAccountExtensionInfoId(accountExtensionInfoId);
    }

    /**
     * 查询账户延期人员信息列表
     *
     * @param csAccountExtensionInfo 账户延期人员信息
     * @return 账户延期人员信息
     */
    @Override
    public List<CsAccountExtensionInfo> selectCsAccountExtensionInfoList(CsAccountExtensionInfo csAccountExtensionInfo)
    {
        return csAccountExtensionInfoMapper.selectCsAccountExtensionInfoList(csAccountExtensionInfo);
    }

    /**
     * 查询账户延期人员信息列表
     *
     * @param resId 资源id
     * @return 账户延期人员信息集合
     */
    @Override
    public List<CsAccountExtensionInfoVO> selectCsAccountExtensionInfoList(String resId) {
        CsAccountExtensionInfo info = new CsAccountExtensionInfo();
        info.setResId(resId);
        info.setDelFlag("0");
        List<CsAccountExtensionInfo> list = csAccountExtensionInfoMapper.selectCsAccountExtensionInfoList(info);
        List<CsAccountExtensionInfoVO> accountExtensionInfoVOList = list.stream()
                .map( item ->{
                    CsAccountExtensionInfoVO add = new CsAccountExtensionInfoVO();
                    add = BeanUtil.toBean(item, CsAccountExtensionInfoVO.class);
                    return add;
                })
                .collect(Collectors.toList());
        return accountExtensionInfoVOList;
    }

    /**
     * 新增账户延期人员信息
     *
     * @param csAccountExtensionInfo 账户延期人员信息
     * @return 结果
     */
    @Override
    public int insertCsAccountExtensionInfo(CsAccountExtensionInfo csAccountExtensionInfo)
    {
        return csAccountExtensionInfoMapper.insertCsAccountExtensionInfo(csAccountExtensionInfo);
    }

    /**
     * 批量新增账户延期人员信息列表
     * @param list  列表
     * @param applyId 申请工单id
     * @param createAt 创建时间
     * @return
     */
    @Override
    public int batchInsertCsAccountExtensionInfo(List<CsAccountExtensionInfoDTO> list, String applyId, Date createAt) {
        List<CsAccountExtensionInfo> reservationAchievementList = list.stream()
                .map(person ->{
                    CsAccountExtensionInfo add = new CsAccountExtensionInfo();
                    add = BeanUtil.toBean(person,CsAccountExtensionInfo.class);
                    add.setAccountExtensionInfoId(IdUtils.fastSimpleUUID());
                    add.setResId(applyId);
                    add.setCreateAt(createAt);
                    add.setDelFlag("0");
                    return add;
                }) // 转换对象类型
                .collect(Collectors.toList());
        return csAccountExtensionInfoMapper.batchInsertCsAccountExtensionInfo(reservationAchievementList);
    }

    /**
     * 修改账户延期人员信息
     *
     * @param csAccountExtensionInfo 账户延期人员信息
     * @return 结果
     */
    @Override
    public int updateCsAccountExtensionInfo(CsAccountExtensionInfo csAccountExtensionInfo)
    {
        return csAccountExtensionInfoMapper.updateCsAccountExtensionInfo(csAccountExtensionInfo);
    }

    /**
     * 批量删除账户延期人员信息
     *
     * @param accountExtensionInfoIds 需要删除的账户延期人员信息主键
     * @return 结果
     */
    @Override
    public int deleteCsAccountExtensionInfoByAccountExtensionInfoIds(String[] accountExtensionInfoIds)
    {
        return csAccountExtensionInfoMapper.deleteCsAccountExtensionInfoByAccountExtensionInfoIds(accountExtensionInfoIds);
    }

    /**
     * 删除账户延期人员信息信息
     *
     * @param accountExtensionInfoId 账户延期人员信息主键
     * @return 结果
     */
    @Override
    public int deleteCsAccountExtensionInfoByAccountExtensionInfoId(String accountExtensionInfoId)
    {
        return csAccountExtensionInfoMapper.deleteCsAccountExtensionInfoByAccountExtensionInfoId(accountExtensionInfoId);
    }

    /**
     * 批量覆盖账户延期人员信息信息
     * @param list  列表
     * @param applyId 申请工单id
     * @param coverTime 覆盖时间
     * @return
     */
    @Override
    public void covertCsAccountExtensionInfo(List<CsAccountExtensionInfoDTO> list, String applyId, Date coverTime) {
        csAccountExtensionInfoMapper.deleteWithResId(applyId);
        if(!CollectionUtils.isEmpty(list)){

            List<CsAccountExtensionInfo> updateCollect = new ArrayList<>();
            List<CsAccountExtensionInfo> insertCollect = new ArrayList<>();

            for (CsAccountExtensionInfoDTO item : list) {
                CsAccountExtensionInfo info = BeanUtil.toBean(item,CsAccountExtensionInfo.class);
                if(StringUtils.isBlank(info.getAccountExtensionInfoId())){
                    info.setAccountExtensionInfoId(IdUtils.fastSimpleUUID());
                    info.setResId(applyId);
                    info.setCreateAt(coverTime);
                    info.setDelFlag("0");
                    insertCollect.add(info);
                }else {
                    info.setResId(applyId);
                    info.setUpdateAt(coverTime);
                    info.setDelFlag("0");
                    updateCollect.add(info);
                }
            }
            if(!CollectionUtils.isEmpty(updateCollect)){
                csAccountExtensionInfoMapper.batchUpdate(updateCollect);
            }
            if(!CollectionUtils.isEmpty(insertCollect)){
                csAccountExtensionInfoMapper.batchInsertCsAccountExtensionInfo(insertCollect);
            }

        }
    }
}
