package com.ruoyi.cs.service.impl;

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

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.bean.BeanUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.cs.domain.CsBusinessMapping;
import com.ruoyi.cs.domain.CsResourceOrderApply;
import com.ruoyi.cs.domain.dto.CsAnnexAddApplyDTO;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.cs.domain.CsAchievementInfoDetails;
import com.ruoyi.cs.domain.vo.CsAnnexApplyVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.cs.mapper.CsAnnexMapper;
import com.ruoyi.cs.domain.CsAnnex;
import com.ruoyi.cs.service.ICsAnnexService;

import javax.annotation.Resource;

/**
 * 附件Service业务层处理
 *
 * @author ruoyi
 * @date 2024-04-30
 */
@Service
public class CsAnnexServiceImpl implements ICsAnnexService
{
    @Resource
    private CsAnnexMapper csAnnexMapper;

    /**
     * 查询附件
     *
     * @param annexId 附件主键
     * @return 附件
     */
    @Override
    public CsAnnex selectCsAnnexByAnnexId(String annexId)
    {
        return csAnnexMapper.selectCsAnnexByAnnexId(annexId);
    }

    /**
     * 查询附件列表
     *
     * @param csAnnex 附件
     * @return 附件
     */
    @Override
    public List<CsAnnex> selectCsAnnexList(CsAnnex csAnnex)
    {
        return csAnnexMapper.selectCsAnnexList(csAnnex);
    }

    /**
     * 新增附件
     *
     * @param csAnnex 附件
     * @return 结果
     */
    @Override
    public int insertCsAnnex(CsAnnex csAnnex)
    {
        csAnnex.setCreateAt(DateUtils.getTime());
        csAnnex.setDelFlag("0");
        return csAnnexMapper.insertCsAnnex(csAnnex);
    }

    /**
     * 修改附件
     *
     * @param csAnnex 附件
     * @return 结果
     */
    @Override
    public int updateCsAnnex(CsAnnex csAnnex)
    {
        csAnnex.setUpdateAt(DateUtils.getTime());
        return csAnnexMapper.updateCsAnnex(csAnnex);
    }

    /**
     * 批量删除附件
     *
     * @param annexIds 需要删除的附件主键
     * @return 结果
     */
    @Override
    public int deleteCsAnnexByAnnexIds(String[] annexIds)
    {
        return csAnnexMapper.deleteCsAnnexByAnnexIds(annexIds);
    }

    /**
     * 删除附件信息
     *
     * @param annexId 附件主键
     * @return 结果
     */
    @Override
    public int deleteCsAnnexByAnnexId(String annexId)
    {
        return csAnnexMapper.deleteCsAnnexByAnnexId(annexId);
    }

    /**
     * 批量新增资源申请表文件信息
     * @param list 资源申请表文件列表
     * @param addApply 申请资源
     * @return
     */
    @Override
    public int batchInsertResourceApplyFiles(List<CsAnnexAddApplyDTO> list, CsResourceOrderApply addApply) {
        String resId = addApply.getApplyId();
        String resName = addApply.getProjectName();
        List<CsAnnex> csAnnexList = list.stream()
                .map(mapping ->{
                    CsAnnex add = new CsAnnex();
                    add = BeanUtil.toBean(mapping,CsAnnex.class);
                    add.setAnnexId(IdUtil.getSnowflakeNextIdStr());
                    add.setResId(resId);
                    add.setResName(resName);
                    add.setResType("0");//资源
                    add.setStatus("0");
                    add.setCreateAt(DateUtils.getTime());
                    add.setDelFlag("0");
                    return add;
                }) // 转换对象类型
                .collect(Collectors.toList());

        //批量新增
        return csAnnexMapper.batchInsertCsAnnexList(csAnnexList);
    }

    /**
     * 获取申请工单的全部附件
     * @param resId 资源/工单 ID
     * @param resType 类型（0-资源，1工单)
     * @return
     */
    @Override
    public List<CsAnnexApplyVO> getApplyFileList(String resId, String resType) {
        return csAnnexMapper.selectApplyCsAnnexList(resId, resType);
    }

    /**
     * 批量新增附件
     * @param list 附件列表
     * @param applyId 申请工单id
     * @param createAt 创建时间
     * @return
     */
    @Override
    public int batchInsertCsAnnexList(List<CsAnnex> list, String applyId, String createAt) {
        List<CsAnnex> csAnnexList = list.stream()
                .map(person ->{
                    CsAnnex add = new CsAnnex();
                    add = BeanUtil.toBean(person,CsAnnex.class);
                    add.setAnnexId(IdUtils.fastSimpleUUID());
                    add.setResId(applyId);
                    add.setResType("1");
                    add.setCreateAt(createAt);
                    add.setDelFlag("0");
                    return add;
                }) // 转换对象类型
                .collect(Collectors.toList());
        return csAnnexMapper.batchInsertCsAnnexList(csAnnexList);
    }

    /**
     * 批量覆盖申请的申请表文件列表
     * @param applyFileList 新的申请表列表
     * @param applyId 申请资源id
     * @param applyName 创建时间
     * @param resType 相关资源类型：0-资源，1-工单，2-
     * @return
     */
    @Override
    public int batchCoverAnnexList(List<CsAnnexAddApplyDTO> applyFileList, String applyId, String applyName, String resType) {
        CsResourceOrderApply addApply = new CsResourceOrderApply();
        addApply.setApplyId(applyId);
        addApply.setApplyType(resType);
        addApply.setProjectName(applyName);
        int delAnnexs = csAnnexMapper.deleteAnnexListByApply(applyId, resType);
        return  batchInsertResourceApplyFiles(applyFileList, addApply);
    }

    /**
     * 批量修改件
     *
     * @param list 附件列表
     * @return
     */
    @Override
    public int batchUpdateCsAnnexList(List<CsAnnex> list) {
        return csAnnexMapper.batchUpdateCsAnnexList(list);
    }
}
