package com.ruoyi.project.business.service.impl;

import com.ruoyi.common.enums.DelFlag;
import com.ruoyi.common.enums.FileBuzType;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.SpecialCharacterEscaper;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.project.business.domain.TbFile;
import com.ruoyi.project.business.domain.TiTemplates;
import com.ruoyi.project.business.mapper.TbFileMapper;
import com.ruoyi.project.business.mapper.TiTemplatesMapper;
import com.ruoyi.project.business.service.ITiTemplatesService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 【出图模板】Service业务层处理
 *
 * @author ruoyi
 * @date 2024-05-16
 */
@Service
public class TiTemplatesServiceImpl implements ITiTemplatesService {

    @Autowired
    private TiTemplatesMapper tiTemplatesMapper;

    @Autowired
    private TbFileMapper tbFileMapper;

    /**
     * 查询【出图模板】
     *
     * @param id 【出图模板】主键
     * @return 【出图模板】
     */
    @Override
    public TiTemplates selectTiTemplatesById(Long id) {
        TiTemplates tiTemplates = tiTemplatesMapper.selectTiTemplatesById(id);
        if (DelFlag.YES.getCode().equals(tiTemplates.getDelFlag())) {
            throw new ServiceException(MessageUtils.message("business.data.deleted"));
        }
        // 查询附件
        List<TbFile> fileList = tbFileMapper.selectTbFileListByBuzIdAndBuzType(id, FileBuzType.BUILDING.getType());
        if (fileList != null && StringUtils.isNotEmpty(fileList)) {
            tiTemplates.setFile(fileList.stream().map(TbFile::getFilePath).collect(Collectors.joining(",")));
        }
        return tiTemplates;
    }

    /**
     * 查询【出图模板】列表
     *
     * @param tiTemplates 【出图模板】
     * @return 【出图模板】
     */
    @Override
    public List<TiTemplates> selectTiTemplatesList(TiTemplates tiTemplates) {
        SpecialCharacterEscaper.escapeSpecialCharacters(tiTemplates
            , TiTemplates::getTemplateName
            , TiTemplates::getElevatorPosition
        );
        SpecialCharacterEscaper.escapeSpecialCharacters(tiTemplates, TiTemplates::getTemplateName,
            TiTemplates::getElevatorPosition);
        return tiTemplatesMapper.selectTiTemplatesList(tiTemplates);
    }

    private void checkTemplateName(TiTemplates tiTemplates) {
        int count = tiTemplatesMapper.selectCountByTemplateName(tiTemplates.getTemplateName(),
            tiTemplates.getElevatorPosition(), tiTemplates.getId());
        if (count > 0) {
            throw new ServiceException(MessageUtils.message("civil.template.repeat"));
        }
    }

    /**
     * 新增【出图模板】
     *
     * @param tiTemplates 【出图模板】
     * @return 结果
     */
    @Override
    public int insertTiTemplates(TiTemplates tiTemplates) {
        checkTemplateName(tiTemplates);
        String userId = SecurityUtils.getStrUserId();
        Date nowDate = DateUtils.getNowDate();
        tiTemplates.setCreateBy(userId);
        tiTemplates.setUpdateBy(userId);
        tiTemplates.setCreateTime(nowDate);
        tiTemplates.setUpdateTime(nowDate);
        int result = tiTemplatesMapper.insertTiTemplates(tiTemplates);
        // 新增附件
        if (StringUtils.isNotEmpty(tiTemplates.getFile())) {
            String[] filePaths = tiTemplates.getFile().split(",");
            List<TbFile> list = new ArrayList<>();
            for (String filePath : filePaths) {
                String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
                TbFile tbFile = new TbFile(tiTemplates.getId(), FileBuzType.BUILDING.getType(),
                    fileName.substring(0, fileName.lastIndexOf("_")), fileName, filePath);
                tbFile.setCreateBy(SecurityUtils.getStrUserId());
                tbFile.setCreateTime(nowDate);
                list.add(tbFile);
            }
            tbFileMapper.batchInsertTbFile(list);
        }
        return result;
    }

    /**
     * 修改【出图模板】
     *
     * @param tiTemplates 【出图模板】
     * @return 结果
     */
    @Override
    public int updateTiTemplates(TiTemplates tiTemplates) {
        checkTemplateName(tiTemplates);
        Date nowDate = DateUtils.getNowDate();
        tiTemplates.setUpdateBy(SecurityUtils.getStrUserId());
        tiTemplates.setUpdateTime(nowDate);
        int result = tiTemplatesMapper.updateTiTemplates(tiTemplates);
        // 修改附件
        tbFileMapper.deleteTbFileByBusinessIdAndType(tiTemplates.getId(), FileBuzType.BUILDING.getType());
        if (StringUtils.isNotEmpty(tiTemplates.getFile())) {
            String[] filePaths = tiTemplates.getFile().split(",");
            List<TbFile> list = new ArrayList<>();
            for (String filePath : filePaths) {
                String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
                TbFile tbFile = new TbFile(tiTemplates.getId(), FileBuzType.BUILDING.getType(),
                    fileName.substring(0, fileName.lastIndexOf("_")), fileName, filePath);
                tbFile.setCreateBy(SecurityUtils.getStrUserId());
                tbFile.setCreateTime(nowDate);
                list.add(tbFile);
            }
            tbFileMapper.batchInsertTbFile(list);
        }
        return result;
    }

    /**
     * 批量删除【出图模板】
     *
     * @param ids 需要删除的【出图模板】主键
     * @return 结果
     */
    @Override
    public int deleteTiTemplatesByIds(Long[] ids) {
        // 校验模板是否已经使用
        int count = tiTemplatesMapper.selectTiTemplatesByIds(ids);
        if (count > 0) {
            throw new ServiceException(MessageUtils.message("business.template.used"));
        }
        // 同时删除附件
        tbFileMapper.deleteTbFileByBusinessIdsAndType(ids, FileBuzType.BUILDING.getType());
        return tiTemplatesMapper.deleteTiTemplatesByIds(ids);
    }

    /**
     * 删除【出图模板】信息
     *
     * @param id 【出图模板】主键
     * @return 结果
     */
    @Override
    public int deleteTiTemplatesById(Long id) {
        return tiTemplatesMapper.deleteTiTemplatesById(id);
    }
}
