package com.vctgo.file.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vctgo.common.core.web.domain.AjaxResult;
import com.vctgo.file.domain.FileShare;
import com.vctgo.system.api.domain.FileInfo;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.multipart.MultipartFile;

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

/**
 * 文件上传接口
 *
 * @author vctgo
 */
public interface ICloudStorageFileService {

    /**
     * 上传文件
     *
     * @param file
     * @return
     */
    AjaxResult upload(MultipartFile file);

    /**
     * 通过租户Id和文件夹Id在云盘文件上传文件
     *
     * @param tenantId    租户id
     * @param directoryId 文件夹id
     * @param file        文件
     * @return
     */
    AjaxResult uploadByTenantIdAndDirectoryId(Long tenantId, Long directoryId, MultipartFile file);

    /**
     * 通过文件夹Id在云盘文件上传文件
     *
     * @param directoryId 文件夹id
     * @param file        文件
     * @return
     */
    AjaxResult uploadByDirectoryId(Long directoryId,String serviceName, MultipartFile file);

    /**
     * 分页获取圆盘数据
     *
     * @param fileInfo
     * @return
     */
    AjaxResult listFileInfo(FileInfo fileInfo);

    /**
     * 分页--云盘获取列表，文件和文件夹融合不分开
     *
     * @param fileInfo
     * @return
     */
    IPage<FileInfo> pageFileInfo(FileInfo fileInfo);

    /**
     * 不分页--通过文件Id获取文件列表信息
     *
     * @param fileInfo
     * @return
     */
    IPage<FileInfo> innerListFile(FileInfo fileInfo);

    /**
     * 创建文件夹
     *
     * @param reqFileInfo
     * @return
     */
    FileInfo mkdir(FileInfo reqFileInfo);

    /**
     * 云盘通过文件对象创建文件夹
     *
     * @param parentId
     * @param fileInfo
     * @return
     */
    AjaxResult mkdirByFileInfo(String parentId, FileInfo fileInfo);

    /**
     * 通过租户Id创建文件夹
     *
     * @param tenantId 租户Id
     * @param parentId 文件夹父Id
     * @param dirName  文件夹名称
     * @return
     */
    AjaxResult mkdirByTenantId(Long tenantId, String parentId, String dirName);

    /**
     * 通过租户和文件对象创建文件夹
     *
     * @param tenantId 租户Id
     * @param parentId 文件夹父Id
     * @param fileInfo 文件夹名称
     * @return
     */
    AjaxResult mkdirByTenantAndFile(Long tenantId, String parentId, FileInfo fileInfo);

    /**
     * 云盘通过文件id批量隐藏文件/文件夹---》回收站
     *
     * @param fileInfoList
     * @return
     */
    AjaxResult hideFileByIds(List<FileInfo> fileInfoList);

    /**
     * 恢复文件夹或者文件
     * ids
     *
     * @return
     */
    AjaxResult recoverFileByIds(List<FileInfo> recoverFileList);

    /**
     * 云盘通过文件id批量移动文件/文件夹
     */
    AjaxResult moveFileByIds(String ids, String toParentId);

    /**
     * 云盘通过文件id分享文件/文件夹
     */
    AjaxResult shareFileFileShare(FileShare fileShare);

    /**
     * 云盘通过文件id取消文件/文件夹
     */
    AjaxResult cancelShareFile(Long id);

    /**
     * 恢复文件夹或者文件
     *
     * @return
     */
    AjaxResult deleteFileByIds(List<FileInfo> deleteFileList);

    /**
     * 服务内部使用--云盘通过文件id删除文件/文件夹
     *
     * @return
     */
    void deleteFileByFileStorageName(List<FileInfo> deleteFileList);

    /**
     * 服务内部使用--云盘通过文件id删除文件/文件夹
     *
     * @return
     */
    AjaxResult innerDeleteFileByIds(List<FileInfo> deleteFileList);

    /**
     * 通过文件信息批量下载文件
     *
     * @param batchDownloadFileList 文件信息列表
     * @param response              响应
     * @param request               请求
     */
    AjaxResult batchDownload(List<FileInfo> batchDownloadFileList, HttpServletResponse response, HttpServletRequest request) throws UnsupportedEncodingException;

    /**
     * 通过文件名称下载压缩包
     *
     * @param fileName
     * @param response
     * @param request
     */
    void downloadByFileName(@PathVariable String fileName, HttpServletResponse response, HttpServletRequest request) throws IOException;

    /**
     * 通过文件信息下载文件
     *
     * @param fileIds   文件信息
     * @param response 响应
     * @param request  请求
     */
    void download(String fileIds, HttpServletResponse response, HttpServletRequest request);

    int updateFileInfo(String fileId, String fileInfo);
}
