const OSS = require('ali-oss');
import { OpResult, logger } from 'mslib';
import { Singleton, Container, Scope } from "typescript-ioc";

/**
 * 阿里云OSS客户端
 * @date 2021-05-26 10:04:52
 * @author 吴锋霖
 */
@Singleton
export class OSSClient {

    private client;

    /**
     * 文件上传
     * @param name 文件名称
     * @param data 文件二级数据
     */
    async upload(name: string, data): Promise<OpResult<string>> {
        const result = await this.client.put(name, data);
        logger.info('文件上传完成----->%j', result)
        if (!result) {
            return OpResult.error('OSS文件上传失败')
        }
        if (result.res.status === 200) {
            return OpResult.success("文件上传成功", result.url)
        } else {
            return OpResult.error(result.res.statusMessage)
        }
    }

    /**
     * 文件下载到内存
     * @param name 文件名称
     */
    async  getBuffer(name: string): Promise<OpResult<any>> {
        try {
            let result = await this.client.get(name);
            return OpResult.success("文件上传成功", result.content)
        } catch (e) {
            return OpResult.error('下载失败：' + e.message)
        }
    }

    /**
    * 文件下载到磁盘
    * @param name 文件名称 exampleobject.txt
    * @param path 文件路径  /opt/app/temp.txt
    */
    async get(name: string, path: string) {
        try {
            // 填写Object完整路径和本地文件的完整路径。Object完整路径中不能包含Bucket名称。
            // 如果指定的本地文件存在会覆盖，不存在则新建。
            // 如果未指定本地路径，则下载后的文件默认保存到示例程序所属项目对应本地路径中。
            let result = await this.client.get(name, path);
            return OpResult.success("文件上传成功", result)
        } catch (e) {
            return OpResult.error('下载失败：' + e.message)
        }
    }

    /**
     * 获取临时授权访问URL
     * @param name 文件名称 exampleobject.txt
     * @param expires 过期时间秒 3600
     */
    async getSignatureUrl(name: string, expires: number) {
        try {
            let url = await this.client.signatureUrl(name, { expires });
            return OpResult.success("操作成功", url)
        } catch (e) {
            return OpResult.error('操作失败：' + e.message)
        }
    }

    /**
     * 初始化OSS 客户端
     * @param region 区域 oss-cn-hangzhou
     * @param accessKeyId  key 
     * @param accessKeySecret 秘钥
     * @param bucket
     */
    init(region: string, accessKeyId: string, accessKeySecret: string, bucket: string) {
        if (this.client) { return }
        const config = {
            region, accessKeyId, accessKeySecret, bucket
        }
        logger.info('初始化OSS客户端----->%j', config)
        this.client = new OSS(config);
    }
}