package com.fdkankan.fyun.face;

import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.Map;

@Component
public interface FYunFileServiceInterface {

    String getFyunType();

    /**
     * 上传文件
     *
     * @param bucket         目标bucket
     * @param data           上传的数据
     * @param remoteFilePath 上传后的文件路径，
     *
     * @return 因为目前一个bucket对应一个域名，因此暂时无法确定上传后的文件路径，因此返回null
     */
    String uploadFile(String bucket, byte[] data, String remoteFilePath) ;

    /**
     * 上传文件至系统默认bucket
     *
     * @param data           上传的数据
     * @param remoteFilePath 上传后的文件路径
     * @return 返回上传文件的链接
     */
    String uploadFile(byte[] data, String remoteFilePath) ;

    /**
     * 上传本地文件
     *
     * @param bucket         目标bucket
     * @param filePath       本地路径
     * @param remoteFilePath 上传后的文件路径
     * @return 因为目前一个bucket对应一个域名，因此暂时无法确定上传后的文件路径，因此返回null
     */
    String uploadFile(String bucket, String filePath, String remoteFilePath) ;

    /**
     * 上传本地文件至系统默认bucket
     *
     * @param filePath       本地路径
     * @param remoteFilePath 上传后的文件路径
     * @return 返回上传文件的链接
     */
    String uploadFile(String filePath, String remoteFilePath) ;

    /**
     * 上传本地文件
     *
     * @param bucket         目标bucket
     * @param inputStream       文件流
     * @param remoteFilePath 上传后的文件路径
     * @return 因为目前一个bucket对应一个域名，因此暂时无法确定上传后的文件路径，因此返回null
     */
    String uploadFile(String bucket, InputStream inputStream, String remoteFilePath) ;

    /**
     * 上传本地文件至系统默认bucket
     *
     * @param inputStream       文件流
     * @param remoteFilePath 上传后的文件路径
     * @return 返回上传文件的链接
     */
    String uploadFile(InputStream inputStream, String remoteFilePath) ;

    /**
     * 上传本地文件
     *
     * @param bucket         目标bucket
     * @param filePath       本地路径
     * @param remoteFilePath 上传后的文件路径
     * @param headers 文件头
     * @return 因为目前一个bucket对应一个域名，因此暂时无法确定上传后的文件路径，因此返回null
     */
    String uploadFile(String bucket, String filePath, String remoteFilePath, Map<String, String> headers) ;

    /**
     * 上传本地文件至系统默认bucket
     *
     * @param filePath       本地路径
     * @param remoteFilePath 上传后的文件路径
     * @param headers 文件头
     * @return 返回上传文件的链接
     */
    String uploadFile(String filePath, String remoteFilePath, Map<String, String> headers) ;

    /**
     * 通过本地脚本上传
     *
     * @param bucket
     * @param filePath
     * @param remoteFilePath
     */
    String uploadFileByCommand(String bucket, String filePath, String remoteFilePath) ;

    /**
     * 通过本地脚本上传
     *
     * @param bucket
     * @param filePath
     * @param remoteFilePath
     */
    void downloadFileByCommand(String bucket, String filePath, String remoteFilePath) ;

    /**
     * 通过本地脚本上传
     *
     * @param filePath
     * @param remoteFilePath
     */
    void downloadFileByCommand(String filePath, String remoteFilePath) ;

    /**
     * 通过本地脚本上传至系统默认bucket
     *
     * @param filePath
     * @param remoteFilePath
     * @return 返回上传文件的链接
     */
    String uploadFileByCommand(String filePath, String remoteFilePath) ;

    /**
     * 删除服务器文件
     *
     * @param bucket
     * @param remoteFilePath
     * @throws IOException
     */
    void deleteFile(String bucket, String remoteFilePath) throws IOException;

    /**
     * 删除系统默认bucket服务器文件
     *
     * @param remoteFilePath
     * @throws IOException
     */
    void deleteFile(String remoteFilePath) throws IOException;

    /**
     * 删除目录
     *
     * @param bucket
     * @param remoteFolderPath
     * @return
     */
    void deleteFolder(String bucket, String remoteFolderPath) ;

    /**
     * 删除系统默认bucket目录
     *
     * @param remoteFolderPath
     * @return
     */
    void deleteFolder(String remoteFolderPath) ;


    /**
     * 上传多个文件
     *
     * @param bucket
     * @param filepaths ：key 本地路径，value,服务器文件路径
     * @
     */
    void uploadMulFiles(String bucket, Map<String, String> filepaths) ;

    /**
     * 上传多个文件至系统默认bucket
     *
     * @param filepaths ：key 本地路径，value,服务器文件路径
     * @
     */
    void uploadMulFiles(Map<String, String> filepaths) ;


    /**
     * 获取文件列表
     *
     * @param bucket
     * @param sourcePath
     * @return
     * @
     */
    List<String> listRemoteFiles(String bucket, String sourcePath) ;

    /**
     * 获取默认bucket文件列表
     *
     * @param sourcePath
     * @return
     * @
     */
    List<String> listRemoteFiles(String sourcePath) ;


    /**
     *
     *在指定bucket 内拷贝文件
     * @param sourcePath
     * @param targetPath
     * @author dengsixing
     * @date 2022/1/18
     **/
    void copyFileInBucket(String bucket, String sourcePath, String targetPath) ;

    /**
     * 在默认bucket 内拷贝文件
     * @param sourcePath
     * @param targetPath
     * @author dengsixing
     * @date 2022/1/18
     **/
    void copyFileInBucket(String sourcePath, String targetPath) ;

    /**
     * <p>
     * 拷贝目录
     * </p>
     *
     * @param sourcePath
     * @param targetPath
     * @author dengsixing
     * @date 2022/1/18
     **/
    void copyFileBetweenBucket(String sourceBucketName, String sourcePath, String targetBucketName, String targetPath) ;

    /**
     * <p>
     * 拷贝目录
     * </p>
     *
     * @param sourcePath
     * @param targetPath
     * @author dengsixing
     * @date 2022/1/18
     **/
    void copyFileToArchive(String sourceBucketName, String sourcePath, String targetBucketName, String targetPath) ;

    /**
     * <p>
     * 拷贝系统bucket目录至指定bucket
     * </p>
     *
     * @param sourcePath
     * @param targetPath
     * @author dengsixing
     * @date 2022/1/18
     **/
    void copyFileBetweenBucket(String sourcePath, String targetBucketName, String targetPath) ;

    /**
     * <p>
     * 拷贝文件
     * </p>
     *
     * @param sourceBucketName
     * @param targetBucketName
     * @author dengsixing
     * @date 2022/1/18
     **/
    void copyFilesBetweenBucket(String sourceBucketName, String targetBucketName, Map<String, String> pathMap) ;

    /**
     * <p>
     * 拷贝系统bucket目录至指定bucket
     * </p>
     *
     * @param targetBucketName
     * @param pathMap
     * @author dengsixing
     * @date 2022/1/18
     **/
    void copyFilesBetweenBucket(String targetBucketName, Map<String, String> pathMap) ;



    /**
     * 获取文件内容,文件内容过大时，会有造成内存溢出的风险，慎用
     *
     * @param bucketName
     * @param remoteFilePath
     * @return
     */
    String getFileContent(String bucketName, String remoteFilePath) ;

    /**
     * 获取默认bucket内容，文件内容过大时，会有造成内存溢出的风险，慎用
     *
     * @param remoteFilePath
     * @return
     */
    String getFileContent(String remoteFilePath) ;


    /**
     * 判断文件是否存在
     *
     * @param objectName
     * @return
     */
    boolean fileExist(String bucket, String objectName) ;

    /**
     * 判断默认bucket文件是否存在
     *
     * @param objectName
     * @return
     */
    boolean fileExist(String objectName) ;

    /**
     * 从指定bucket下载文件
     *
     * @param bucket
     * @param remoteFilePath
     * @param localPath
     * @return
     */
    public void downloadFile(String bucket, String remoteFilePath, String localPath) ;

    /**
     * 从系统默认bucket下载文件
     *
     * @param remoteFilePath
     * @param localPath
     * @
     */
    public void downloadFile(String remoteFilePath, String localPath) ;

    public URL getPresignedUrl(String url);

    public URL getPresignedUrl(String bucket,String url);

    public long getSubFileNums(String url);

    public long getSubFileNums(String bucket,String url);

    public Boolean checkStore(String bucket,String url);

    public void restoreFolder(String bucket,String url);

    public Integer getRestoreFolderProcess(String bucket,String url);

    public void restoreFolder(String bucket, String folderName, Integer priority);

    public void restoreFile(String bucket, String objectName, Integer priority);

    public Long getSpace(String bucket, String key);
}
