package com.ruoyi.service.impl;

import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.domain.ReviewEnterpriseArchive;
import com.ruoyi.domain.Task;
import com.ruoyi.domain.vo.EnterpriseImportFileVO;
import com.ruoyi.domain.vo.ReviewEnterpriseArchiveViewItemVO;
import com.ruoyi.domain.vo.ReviewEnterpriseArchiveViewVO;
import com.ruoyi.mapper.TaskMapper;
import com.ruoyi.service.ReviewEnterpriseArchiveService;
import com.ruoyi.mapper.ReviewEnterpriseArchiveMapper;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.request.ReviewEnterpriseArchiveFindByTaskIdRequest;
import com.ruoyi.web.request.ReviewEnterpriseArchiveFindFileNameListRequest;
import com.ruoyi.web.request.ReviewEnterpriseArchiveFindRequest;
import com.ruoyi.web.request.ReviewEnterpriseArchiveGetInfoRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;

import static com.ruoyi.common.utils.DateUtils.getNowDate;

/**
* @author wangfei
* @description 针对表【t_review_enterprise_archive(车企留档文件)】的数据库操作Service实现
* @createDate 2024-02-22 15:32:57
*/
@Service
public class ReviewEnterpriseArchiveServiceImpl extends ServiceImpl<ReviewEnterpriseArchiveMapper, ReviewEnterpriseArchive>
    implements ReviewEnterpriseArchiveService {

    @Autowired
    private ReviewEnterpriseArchiveMapper reviewEnterpriseArchiveMapper;

    @Autowired
    private ISysUserService sysUserService;

    @Autowired
    private ReviewEnterpriseArchiveService reviewEnterpriseArchiveService;

    @Autowired
    private TaskMapper taskMapper;


    @Override
    public List<ReviewEnterpriseArchiveViewVO> view(Long taskId) {

        Task task = taskMapper.selectById(taskId);

        List<ReviewEnterpriseArchive> archives = reviewEnterpriseArchiveMapper.findByTaskId(taskId);

        List<ReviewEnterpriseArchiveViewVO> resultList = new ArrayList<>();

        // 原始数据originalList
        List<ReviewEnterpriseArchiveViewVO> originalList = new ArrayList<>();

        if (task.getSystemReviewTaskId() != null) {
            originalList.addAll(
                    buildReviewEnterpriseArchiveViewVO(archives, reviewEnterpriseArchiveMapper.findViewItemVOByTaskId(task.getSystemReviewTaskId()))
            );
        }

        if (task.getCarReviewTaskId() != null) {
            originalList.addAll(
                    buildReviewEnterpriseArchiveViewVO(archives, reviewEnterpriseArchiveMapper.findViewItemVOByTaskId(task.getCarReviewTaskId()))
            );
        }

        // 创建一个映射,将文件名作为键,将具有相同文件名的对象列表作为值
        Map<String, List<ReviewEnterpriseArchiveViewVO>> map = new HashMap<>();

        // 遍历原始列表,将对象合并到相应的文件名键所对应的值列表中
        for (ReviewEnterpriseArchiveViewVO item : originalList) {
            String fileName = item.getFileName();
            if (!map.containsKey(fileName)) {
                map.put(fileName, new ArrayList<>());
            }
            map.get(fileName).add(item);
        }

        // 遍历映射中的值列表,将对象合并到结果列表中
        for (List<ReviewEnterpriseArchiveViewVO> itemList : map.values()) {
            // 如果有多个对象,合并它们
            if (itemList.size() > 1) {
                ReviewEnterpriseArchiveViewVO mergedItem = mergeItems(itemList);
                resultList.add(mergedItem);
            } else {
                resultList.addAll(itemList);
            }
        }

        return resultList;
    }

    /**
     * 合并具有相同文件名的对象
     * @param itemList
     * @return
     */
    private static ReviewEnterpriseArchiveViewVO mergeItems(List<ReviewEnterpriseArchiveViewVO> itemList) {
        // 创建一个新的 ReviewEnterpriseArchiveViewVO 对象来保存合并后的结果
        ReviewEnterpriseArchiveViewVO mergedItem = new ReviewEnterpriseArchiveViewVO();

        // 由于这里 items 列表需要合并,因此需要创建一个新的列表来保存合并后的结果
        List<ReviewEnterpriseArchiveViewItemVO> mergedItemList = new ArrayList<>();

        // 遍历 itemList 列表,将所有的 items 合并到 mergedItemList 中
        for (ReviewEnterpriseArchiveViewVO item : itemList) {
            mergedItemList.addAll(item.getItems());
        }

        // 将合并后的 items 设置到 mergedItem 中
        mergedItem.setItems(mergedItemList);

        // 对于其他属性,这里简单地选择第一个对象中的值作为合并后的结果
        mergedItem.setId(itemList.get(0).getId());
        mergedItem.setFileName(itemList.get(0).getFileName());

        return mergedItem;
    }

    @Override
    public Long addEnterpriseArchive(ReviewEnterpriseArchive reviewEnterpriseArchive) {

        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysUser user = sysUserService.selectUserById(loginUser.getUserId());

        reviewEnterpriseArchive.setCreateBy(user.getNickName());
        reviewEnterpriseArchive.setCreateTime(new Date());

        Long sum = reviewEnterpriseArchiveMapper.findFileName(reviewEnterpriseArchive.getTaskId(),reviewEnterpriseArchive.getFileName());

        if (sum >0 ) {
            throw new ServiceException("新增文件名称重复,请检查", HttpStatus.ERROR);
        } else {
            reviewEnterpriseArchiveService.save(reviewEnterpriseArchive);

            ReviewEnterpriseArchiveFindByTaskIdRequest request = new ReviewEnterpriseArchiveFindByTaskIdRequest();
            request.setTaskId(reviewEnterpriseArchive.getTaskId());
            List<ReviewEnterpriseArchive> list = reviewEnterpriseArchiveMapper.findEnterpriseArchiveByTaskId(request);
            if (list != null && list.size() != 0) {
                for (ReviewEnterpriseArchive archive : list) {
                    if (!Objects.equals(archive.getEnterpriseName(), reviewEnterpriseArchive.getEnterpriseName())) {
                        archive.setEnterpriseName(reviewEnterpriseArchive.getEnterpriseName());
                    }
                }
                reviewEnterpriseArchiveService.updateBatchById(list);
            }
        }

        return reviewEnterpriseArchive.getId();


    }

    @Override
    public List<ReviewEnterpriseArchive> findEnterpriseArchive(ReviewEnterpriseArchiveFindRequest request) {
        return reviewEnterpriseArchiveMapper.findEnterpriseArchive(request);
    }

    @Override
    public ReviewEnterpriseArchive getInfo(ReviewEnterpriseArchiveGetInfoRequest request) {
        return reviewEnterpriseArchiveMapper.selectById(request.getId());
    }


    @Override
    public List<ReviewEnterpriseArchive> findList(ReviewEnterpriseArchiveFindFileNameListRequest request) {
        return reviewEnterpriseArchiveMapper.findList(request.getTaskId());
    }

    @Override
    public List<ReviewEnterpriseArchive> findEnterpriseArchiveByTaskId(ReviewEnterpriseArchiveFindByTaskIdRequest request) {
        return reviewEnterpriseArchiveMapper.findEnterpriseArchiveByTaskId(request);
    }

    private List<ReviewEnterpriseArchiveViewVO> buildReviewEnterpriseArchiveViewVO(List<ReviewEnterpriseArchive> archives, List<ReviewEnterpriseArchiveViewItemVO> viewItems) {

        List<ReviewEnterpriseArchiveViewVO> viewList = new ArrayList();

        for(ReviewEnterpriseArchive archive : archives) {
            ReviewEnterpriseArchiveViewVO view = new ReviewEnterpriseArchiveViewVO();
            view.setId(archive.getId());
            view.setFileName(archive.getFileName());
            setReviewEnterpriseArchiveViewItemVO(view, viewItems);

            viewList.add(view);
        }

        return viewList;
    }

    private void setReviewEnterpriseArchiveViewItemVO(ReviewEnterpriseArchiveViewVO view, List<ReviewEnterpriseArchiveViewItemVO> viewItems) {
        if (viewItems == null) return;
        List<ReviewEnterpriseArchiveViewItemVO> subList = new ArrayList();
        Long archiveId = view.getId();

        for(ReviewEnterpriseArchiveViewItemVO item : viewItems) {
            if(item.getArchiveId() != null && item.getArchiveId().equals(archiveId)) {
                subList.add(item);
            }
        }

        view.setItems(subList);
    }

    @Override
    public void importEnterprise(List<EnterpriseImportFileVO> list,Long taskId, HttpServletResponse response){
        for(EnterpriseImportFileVO vo: list){
            vo.setCreateTime(getNowDate());
            vo.setCreateBy( SecurityUtils.getLoginUser().getUser().getNickName());
            vo.setTaskId(Long.valueOf(taskId));
            vo.setId(IdUtil.getSnowflake().nextId());
            Long sum = reviewEnterpriseArchiveMapper.findFileName(Long.valueOf(taskId), vo.getFileName());
            if (sum >0 ) {
                throw new ServiceException("新增文件名称重复,请检查", HttpStatus.ERROR);
            }
            if(vo.getFileName().isEmpty()){
                throw new ServiceException("文件名称不能为空", HttpStatus.ERROR);
            }
        }
        reviewEnterpriseArchiveMapper.insertEnterprise(list);
    }
}