//
//  OBSInitiateMultipartUploadModel.h
//  OBS
//
//  Created by MaxZhang on 01/12/2017.
//  Copyright © 2017 obs. All rights reserved.
//

#ifndef OBSInitiateMultipartUploadModel_h
#define OBSInitiateMultipartUploadModel_h

#import "OBSBaseNetworking.h"
#import "OBSClient.h"
#import "OBSServiceBaseModel.h"
#import "OBSServiceConstDefinition.h"

@class OBSAbstractEncryption;
    //request
#pragma mark - request

/**
 初始化多段上传任务
 */
@protocol OBSInitiateMultipartUploadProtocol<NSObject>
@required

/**
 桶名
 */
@property (nonatomic, strong, nonnull) NSString *bucketName;

/**
 对象名
 */
@property (nonatomic, strong, nonnull) NSString *objectKey;

/**
 对象访问策略
 */
@property (nonatomic, assign) OBSACLPolicy objectACLPolicy;

/**
 存储类型
 */
@property (nonatomic, assign) OBSStorageClass storageClass;

/**
 元数据
 */
@property (nonatomic, strong, nullable) NSDictionary *metaDataDict;

/**
 对象重定向
 */
@property (nonatomic, strong, nonnull) NSString *websiteRedirectLocation;

/**
 加密方式
 */
@property (nonatomic, strong, nonnull) __kindof OBSAbstractEncryption *encryption;
/**
 MIME类型
 */
@property (nonatomic, assign) OBSContentType contentType;
/**
 x-obs-forbid-overwrite 头域
 */
@property (nonatomic, nullable) NSString * forbid_overwrite;

@end



/**
 初始化多段上传任务request
 */
@interface OBSInitiateMultipartUploadRequest : OBSBaseRequest<OBSInitiateMultipartUploadProtocol>

/**
 桶名
 */
@property (nonatomic, strong, nonnull) NSString *bucketName;

/**
 对象KEY
 */
@property (nonatomic, strong, nonnull) NSString *objectKey;

/**
 对象ACL
 */
@property (nonatomic, assign) OBSACLPolicy objectACLPolicy;

/**
 存储模式
 */
@property (nonatomic, assign) OBSStorageClass storageClass;

/**
 元数据
 */
@property (nonatomic, strong, nullable) NSDictionary *metaDataDict;

/**
 重定向网址
 */
@property (nonatomic, strong, nonnull) NSString *websiteRedirectLocation;

/**
 加密方式
 */
@property (nonatomic, strong, nullable) __kindof OBSAbstractEncryption *encryption;

/**
 MIME类型
 */
@property (nonatomic, assign) OBSContentType contentType;

/**
 自定义MIME类型
 */
@property (nonatomic, strong, nonnull) NSString *customContentType;

/**
 最终映射MIME类型
 */
@property (nonatomic, strong, nonnull) NSString *finalContentType;
/**
 x-obs-forbid-overwrite 头域
 */
@property (nonatomic, nullable) NSString * forbid_overwrite;

/**
 初始化多段上传任务request

 @param bucketName 桶名
 @param objectKey 对象KEY
 @return 初始化多段上传任务request
 */
-(instancetype)initWithBucketName:(NSString*) bucketName objectKey: (NSString*) objectKey;
@end

#pragma mark - networking request
@interface OBSNetworkingInitiateMultipartUploadRequest : OBSServiceNetworkingCommandRequest
@end

    //response
#pragma mark - response

/**
 初始化多段上传任务response
 */
@interface OBSInitiateMultipartUploadResponse: OBSServiceResponse

/**
 桶名
 */
@property (nonatomic, strong, nonnull) NSString *bucketName;

/**
 对象名
 */
@property (nonatomic, strong, nonnull) NSString *objectKey;

/**
 多段上传ID
 */
@property (nonatomic, strong, nonnull) NSString *uploadID;

/**
 存储类型
 */
@property (nonatomic, assign) OBSStorageClass storageClass;

/**
 加密方式
 */
@property (nonatomic, strong, nonnull) __kindof OBSAbstractEncryption *encryption;
@end

    //client method
#pragma mark - client method
@interface OBSClient(initiateMultipartUpload)

/**
 初始化多段上传任务

 @param request 初始化多段上传任务request
 @param completionHandler 初始化多段上传任务回调
 @return OBSBFTask
 */
- (OBSBFTask*)initiateMultipartUpload:(__kindof OBSBaseRequest<OBSInitiateMultipartUploadProtocol>*)request
      completionHandler:(void (^)(OBSInitiateMultipartUploadResponse  * response, NSError * error))completionHandler;
@end
#endif /* OBSInitiateMultipartUploadModel_h */
