package com.yaoyicloud.easier.common.file.core;

import java.io.InputStream;
import java.util.List;

import org.springframework.beans.factory.InitializingBean;

import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectSummary;

/**
 * 文件操作模板
 *
 * @author jimmy
 * @version 1.0.0
 * @date 2022-12-02 21:18
 */
public interface FileTemplate extends InitializingBean {

    /**
     * 创建bucket
     *
     * @param bucketName bucket名称
     */
    void createBucket(String bucketName);

    /**
     * 获取全部bucket
     */
    List<Bucket> getAllBuckets();

    /**
     * 删除桶
     *
     * @param bucketName bucket名称
     */
    void removeBucket(String bucketName);

    /**
     * 上传文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @param dir 文件夹名称
     * @param stream 文件流
     * @param contextType 文件类型
     * @throws Exception 异常
     */
    void putObject(String bucketName, String dir, String objectName, InputStream stream, String contextType)
        throws Exception;

    /**
     * 上传文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @param stream 文件流
     * @param contextType 文件类型
     * @throws Exception 异常
     */
    void putObject(String bucketName, String objectName, InputStream stream, String contextType) throws Exception;

    /**
     * 上传文件（流格式）
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @param stream 文件流
     * @throws Exception 上传文件
     */
    void putObject(String bucketName, String objectName, InputStream stream) throws Exception;

    /**
     * 获取文件
     *
     * @param bucketName bucket名称
     * @param dir 文件夹名称
     * @param objectName 文件名称
     * @return 二进制流 API Documentation
     */
    S3Object getObject(String bucketName, String dir, String objectName);

    /**
     * 获取文件
     *
     * @param bucketName bucket名称
     * @param objectName 文件名称
     * @return 二进制流 API Documentation</a>
     */
    S3Object getObject(String bucketName, String objectName);

    /**
     * 获取文件外链
     *
     * @param bucketName 桶名称
     * @param objectName 文件名称
     * @param expires 有效期
     * @return 外链接
     */
    String getObjectURL(String bucketName, String objectName, Integer expires);

    /**
     * 删除对象
     *
     * @param bucketName 桶名称
     * @param objectName 对象名称
     * @throws Exception 异常
     */
    void removeObject(String bucketName, String objectName) throws Exception;

    /**
     * 初始化后续动作
     */
    @Override
    default void afterPropertiesSet() {}

    /**
     * 根据文件前置查询文件
     *
     * @param bucketName bucket名称
     * @param prefix 前缀
     * @param recursive 是否递归查询
     * @return S3ObjectSummary 列表
     * @see <a href="http://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01/ListObjects">AWS API Documentation</a>
     */
    List<S3ObjectSummary> getAllObjectsByPrefix(String bucketName, String prefix, boolean recursive);

}
