package com.ruoyi.service.impl;

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.SecurityUtils;
import com.ruoyi.domain.ReviewEnterpriseArchive;
import com.ruoyi.domain.Task;
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 java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
* @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<>();

        resultList.addAll(
                buildReviewEnterpriseArchiveViewVO(archives, reviewEnterpriseArchiveMapper.findViewItemVOByTaskId(task.getSystemReviewTaskId()))
        );

        resultList.addAll(
                buildReviewEnterpriseArchiveViewVO(archives, reviewEnterpriseArchiveMapper.findViewItemVOByTaskId(task.getCarReviewTaskId()))

        );

        return resultList;
    }

    @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);
    }
}