package com.microservices.file.service;

import com.microservices.system.api.domain.SysFileInfo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;

/**
 * 文件管理Service接口
 *
 * @author microservices
 * @date 2021-12-29
 */
public interface ISysFileInfoService {
    /**
     * 查询文件管理
     *
     * @param fileObjectName
     * @return 文件管理
     */
    public SysFileInfo selectSysFileInfoByFileObjectName(String fileObjectName);

    /**
     * 查询文件管理
     *
     * @param fileId 文件管理主键
     * @return 文件管理
     */
    public SysFileInfo selectSysFileInfoByFileId(Long fileId);

    /**
     * 查询文件管理列表
     *
     * @param sysFileInfo 文件管理
     * @return 文件管理集合
     */
    public List<SysFileInfo> selectSysFileInfoList(SysFileInfo sysFileInfo);

    /**
     * 新增文件管理
     *
     * @param sysFileInfo 文件管理
     * @return 结果
     */
    public int insertSysFileInfo(SysFileInfo sysFileInfo);

    /**
     * 修改文件管理
     *
     * @param sysFileInfo 文件管理
     * @return 结果
     */
    public int updateSysFileInfo(SysFileInfo sysFileInfo);

    /**
     * 批量删除文件管理
     *
     * @param fileIds 需要删除的文件管理主键集合
     * @return 结果
     */
    public int deleteSysFileInfoByFileIds(Long[] fileIds);

    /**
     * 删除文件管理信息
     *
     * @param fileId 文件管理主键
     * @return 结果
     */
    public int deleteSysFileInfoByFileId(Long fileId);

    /**
     * 删除文件管理信息
     *
     * @param fileObjectName
     * @return 结果
     */
    public int deleteSysFileInfoByFileObjectName(String fileObjectName);

    /**
     * 通过文件Id列表获取文件信息列表
     *
     * @param fileIds
     * @return
     */
    List<SysFileInfo> getFileListByFileIds(String fileIds);

    /**
     * 文件上传
     *
     * @param baseDir 相对应用的基目录
     * @param file    上传的文件
     * @return 返回上传成功的文件名
     */
    String upload(String baseDir, MultipartFile file);

    /**
     * 文件上传
     *
     * @param file 相对应用的基目录
     * @param type 上传的文件类型
     * @return 返回上传成功的文件名
     */
    SysFileInfo upload(MultipartFile file, String type, String hierarchy);

    /**
     * 根据文件标识获取文件详情
     *
     * @param fileIdentifier 文件标识
     * @return 文件详情
     */
    SysFileInfo selectSysFileInfoByFileIdentifier(String fileIdentifier);

    /**
     * 通过文件id下载文件
     *
     * @param fileId   文件id
     * @param response 响应体
     * @param request  请求体
     */
    void fileDownloadById(Long fileId, HttpServletResponse response, HttpServletRequest request);

    /**
     * 通过文件标识下载文件
     *
     * @param fileIdentifier 文件标识
     * @param response       响应体
     * @param request        请求体
     */
    void fileDownloadByIdentifier(String fileIdentifier, HttpServletResponse response, HttpServletRequest request);

    /**
     * 通过文件标识列表获取文件详情列表
     *
     * @param fileIdentifiers 文件标识列表，逗号分隔
     * @return 文件详情列表
     */
    List<SysFileInfo> getFileListByIdentifier(String fileIdentifiers);

    /**
     * 通过文件标识删除文件
     *
     * @param fileIdentifier 文件标识
     * @param type           文件类型
     * @return 响应
     */
    boolean deleteFile(String fileIdentifier, String type);

    /**
     * 通过文件标识列表批量删除文件
     *
     * @param fileIdentifiers 文件标识列表
     * @return 删除结果
     */
    Boolean deleteFileByIdentifiers(String fileIdentifiers);

    /**
     * 根据文件标识获取文件实体
     *
     * @param fileIdentifier 文件标识
     */
    void getFileEntityByIdentifier(HttpServletResponse response, String fileIdentifier);

    /**
     * @param packagedStructure 打包结构<文件包内路径,文件来源（文件标识或文件下载地址）>
     * @param zipFileName       压缩文件名（不包含文件后缀）
     * @param type              微服务类型
     * @param hierarchy         层次结构
     * @return 压缩包文件标识
     */
    String packagedFile(HashMap<String, String> packagedStructure, String zipFileName, String type, String hierarchy);
}
