package com.sunxung.factoring.service.sys;

import com.baomidou.mybatisplus.extension.service.IService;
import com.sunxung.factoring.dict.impl.FileModuleDict;
import com.sunxung.factoring.entity.sys.FileStorage;
import com.sunxung.factoring.entity.sys.SysAttachmentRef;
import com.sunxung.factoring.service.sys.dto.AttachmentDto;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 通用附件关系表 服务类
 * </p>
 *
 * @author daxian
 * @since 2022-02-28
 */
public interface ISysAttachmentRefService extends IService<SysAttachmentRef> {

    /**
     * 保存文件及文件关系
     *
     * @param multipartFile
     * @param attachmentDto
     * @return
     */
    boolean saveFileAndRef(List<MultipartFile> multipartFile, AttachmentDto attachmentDto);

    /**
     * 保存文件及文件关系(历史文件)
     *
     * @param fileStorageList
     * @param attachmentDto
     * @return
     */
    boolean saveFileAndRefHis(List<FileStorage> fileStorageList, AttachmentDto attachmentDto);

    /**
     * 保存已有文件和附件的关系，不上传文件
     *
     * @param fileIdList 原文件关系
     * @return
     */
    boolean saveRef(List<Long> fileIdList, AttachmentDto attachmentDto);

    /**
     * 移除文件及关系(只删fileStorage,不真正删文件)
     *
     * @return
     */
    boolean removeFilestorageAndRef(AttachmentDto attachmentDto);

    /**
     * 移除文件及关系(既删fileStorage,又删文件)
     *
     * @return
     */
    boolean removeFileAndRef(AttachmentDto attachmentDto);

    /**
     * 移除文件及关系(只删fileStorage,不真正删文件)
     *
     * @param deleteFileIds 删除文件Id集合
     * @return
     */
    boolean removeFilestorageAndRef(List<Long> deleteFileIds);

    /**
     * 移除关系
     *
     * @param attachmentDto
     * @return
     */
    boolean removeRef(AttachmentDto attachmentDto);

    /**
     * 获取文件集合
     *
     * @return
     */
    List<FileStorage> getFiles(AttachmentDto attachmentDto);

    /**
     * 拷贝文件并保存
     *
     * @param fileStorage
     * @param attachmentDto
     * @return
     */
    FileStorage copyFile(FileStorage fileStorage, FileModuleDict.ChildEnum moduleType, AttachmentDto attachmentDto);


    /**
     * 默认的获取文件流方法
     *
     * @param request
     * @param fileName
     * @return
     */
    default List<MultipartFile> getMultipartFileFromRequest(HttpServletRequest request, String fileName) {

        if (request instanceof MultipartHttpServletRequest) {
            MultiValueMap<String, MultipartFile> multiValueMap = ((MultipartHttpServletRequest) request)
                    .getMultiFileMap();
            List<MultipartFile> fileList = new ArrayList<>();
            for (String key : multiValueMap.keySet()) {
                if (key.startsWith(fileName)) {
                    fileList.addAll(multiValueMap.get(key));
                }
            }
            return fileList;
        }
        return null;
    }

    List<FileStorage> getCfiles(AttachmentDto attachmentDto);
}
