package com.sunxung.factoring.service.sys;

import com.sunxung.factoring.dict.impl.FileModuleDict;
import com.sunxung.factoring.dict.impl.FileModuleDict.ChildEnum;
import com.sunxung.factoring.entity.sys.FileStorage;
import com.sunxung.factoring.entity.sys.FileStorage.Belong;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * 文件存储service
 */
public interface FileStorageService {

    /**
     * 从request里面获取附件对象，然后新增
     *
     * @param request
     * @param moduleType
     * @return
     * @throws IllegalStateException
     * @throws IOException           List<FileStorage>
     */
    List<FileStorage> add(HttpServletRequest request, FileModuleDict.ChildEnum moduleType)
            throws IllegalStateException, IOException;

    List<FileStorage> add(List<FileStorage> fileStorages);

    FileStorage update(FileStorage fileStorage);

    /**
     * 更新文件附属对象
     *
     * @param id     文件id
     * @param belong 附属对象
     * @return
     */
    boolean updateBelongById(Long id, Belong belong);

    /**
     * 删除文件（逻辑删除）
     *
     * @param id
     * @return
     */
    boolean delete(Long id);

    FileStorage get(Long id);

    /**
     * 文件下载
     *
     * @param id 文件Id
     * @param
     */
    ResponseEntity<Object> downloadFile(Long id);

    /**
     * 获取文件信息
     *
     * @param belongId 附属对象Id
     * @return
     */
    List<FileStorage> findByBelongId(String belongId);

    /**
     * 保存单个文件， 获取文件（相对）路径
     *
     * @param request
     * @param moduleType
     * @return
     */
    String getFilePath(HttpServletRequest request, ChildEnum moduleType) throws IllegalStateException, IOException;

    /**
     * 保存单个文件， 获取文件（绝对）路径
     *
     * @param request    request对象
     * @param moduleType 附件的存储文件枚举
     * @return
     */
    String getAbsoluteFilePath(HttpServletRequest request, ChildEnum moduleType)
            throws IllegalStateException, IOException;

    /**
     * 新增附件信息：同一个表单里面可以上传单个文件
     *
     * @param multipartFile multipartFile附件
     * @param moduleType    附件的存储文件枚举
     * @return
     * @throws IllegalStateException
     * @throws IOException           FileStorage
     */
    FileStorage addFileStorage(MultipartFile multipartFile, FileModuleDict.ChildEnum moduleType)
            throws IllegalStateException, IOException;

    /**
     * 删除附件
     *
     * @param fileId 文件Id
     * @return
     */
    Boolean deleteFile(Long fileId);

    /**
     * 新增单个附件
     *
     * @param fileStorage
     * @return FileStorage
     */
    FileStorage add(FileStorage fileStorage);

    /**
     * 通过Url下载 采购合同文件、出征文件 并存储
     *
     * @param contractId
     * @param moduleType
     * @param downUrl
     * @return
     */
    FileStorage addFileStorageWithBelongAndName(String contractId, FileModuleDict.ChildEnum moduleType, String downUrl,Long supplemementId);

    List<FileStorage> findByBelongIdAndBelongType(String belongId, String belongType);

    /**
     * 保存附件关系到中间表
     * @param fileStorage
     * @param moduleType
     * @param entityId
     */
    void saveAttachmentRefByFileStorage(FileStorage fileStorage,FileModuleDict.ChildEnum moduleType,Long entityId);

    /**
     * 上传附件
     * @param req
     * @param moudleName
     * @return
     */
    List<FileStorage> doUploadFiles(HttpServletRequest req, String moudleName) throws IOException;

    /**
     * 删除无用文件id集合
     * @return
     */
    void deleteInvalidFileStorage();

    /**
     * 删除文件 只删除fileStorage
     * @param id
     */
    Boolean deleteFileStorage(Long id);

    /**
     * 文件打包下载 zip
     * @param fileStorageList 文件合集
     * @param name 文件名
     * @param moduleType 文件所在的模块名
     * @param response
     */
   void downloadZipFile(List<FileStorage> fileStorageList, String name, FileModuleDict.ChildEnum moduleType,HttpServletResponse response);

    /**
     * 给文件夹中重名的文件重命名
     *
     * @param fileStorageList
     */
   void renameFileStorageList(List<FileStorage> fileStorageList);

    /**
     * 文件下载
     *
     * @param res id
     * @param
     */
    void do_UploadFile(HttpServletResponse res, Long id);

    /**
     * 保存文件
     * @param fileIds c端文件表id
     * @return
     */
    List<FileStorage> saveFileStorage(List<Long> fileIds);

    void updateBusinessId(Long fileId, Long businessId);
}
