//
//  KWMAPIManager.m
//  iXiaoWeiOA
//
//  Created by kevin on 3/14/15.
//  Copyright (c) 2015 kollway. All rights reserved.
//

#import "KWMAPIManager.h"
#import "KWMStringUtil.h"
#import "KWMRequestListResult.h"
#import "KWMBaseModel.h"
#import "KWMUser.h"
#import "NSString+SAMAdditions.h"
#import "KWMAPIManager.h"
#import <UIImageView+WebCache.h>
#import "KWMUserDao.h"
#import "KWMCustomer.h"
#import "KWMCustomerResult.h"
#import "KWMBrandsTypeResult.h"
#import "KWMBrandsTypeModel.h"
#import "KWMDictionaryResult.h"
#import <RegexKitLite/RegexKitLite.h>
#import <SAMKeychain/SAMKeychain.h>
#import "KWMUserModel.h"
#import "KWMHttpUtil.h"



typedef NS_ENUM(NSInteger, KWMHTTPMethod) {
    KWMHTTPMethodGET = 0,
    KWMHTTPMethodPOST,
    KWMHTTPMethodPUT,
    KWMHTTPMethodDELETE
};

@implementation KWMAPIManager

+ (KWMAPIManager *)sharedManager {
    static KWMAPIManager *_sharedManager = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _sharedManager = [[self alloc] init];
    });
    return _sharedManager;
}

- (NSString *)toAbsoluteUrl:(NSString *)relativeUrl {
    if([KWMStringUtil isEmpty:relativeUrl]){
        return self.baseUrl;
    }
    if([relativeUrl rangeOfString:@"http"].location == 0){
        return relativeUrl;
    }
    return [[NSString alloc] initWithFormat:@"%@%@", self.baseUrl, relativeUrl];
}

- (NSString *)baseUrl {
    if(! _baseUrl){
        if (API_HOST_PORT != 8088) {
            _baseUrl = [[NSString alloc] initWithFormat:@"https://%@:%d", API_HOST, API_HOST_PORT];
        }else{
            _baseUrl = [[NSString alloc] initWithFormat:@"https://%@", API_HOST];
        }
    }
    return _baseUrl;
}

/**
 * 根据API返回类型,模型类型创建成功callback
 */
- (void(^)(NSURLSessionDataTask *, id ))buildSuccessCallbackWithResultClass:(Class)requestResultClass
                                                                 modelClass:(Class)modelClass
                                                                    success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                                                                    failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure{
    void(^successCallback)(NSURLSessionDataTask *, id ) =
    ^(NSURLSessionDataTask *task, id jsonDict){
        NSError *error;
        id result = nil;
        @try {
            //#ifdef DEBUG
//            NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDict options:NSJSONWritingPrettyPrinted error:&error];
//            NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
//            NSLog(@"%@", jsonString);
            //#endif
            result = [[requestResultClass alloc] initWithDictionary:jsonDict modelClass:modelClass error:&error];
        }
        @catch (NSException *e){
            NSLog(@"%@", [e description]);
        }
        @finally{
            [self checkRequestResult:result];
            if(error){
                failure(task, error);
            }else{
                success(task, result);
            }
        }
    };
    return successCallback;
}

/**
 * 检测API返回错误号
 */
- (void)checkRequestResult:(id)requestResult {
    if(! requestResult) {
        return;
    }
    
    NSString *message = nil;
    NSInteger responseCode = 0;
    if([requestResult isKindOfClass:[KWMRequestResult class]]){
        responseCode = ((KWMRequestResult *)requestResult).code;
        message = ((KWMRequestResult *)requestResult).message;
    }else if([requestResult isKindOfClass:[KWMRequestListResult class]]){
        responseCode = ((KWMRequestListResult *)requestResult).code;
        message = ((KWMRequestListResult *)requestResult).message;
    }else{
        return;
    }
    
    switch (responseCode){
        case 1: {
            [[NSNotificationCenter defaultCenter] postNotificationName:KWMReceiverNoLogin object:nil userInfo: nil];
            break;
        }
        default:break;
    }
}

/**
 * 处理列表API的请求参数
 */
- (NSDictionary *)processListAPIParameters:(NSDictionary *)parameters {
    static NSString *KEY_PAGE = @"page";
    static NSString *KEY_PAGE_SIZE = @"pagesize";
    NSMutableDictionary *mutableParameters = [[NSMutableDictionary alloc] initWithDictionary:parameters];
    
    NSAssert((mutableParameters && mutableParameters[KEY_PAGE]), @"required parameter: page");
    
    if(!mutableParameters[KEY_PAGE_SIZE]){
        mutableParameters[KEY_PAGE_SIZE] = @(KWM_PAGE_SIZE).stringValue;
    }
    
    return [[NSDictionary alloc] initWithDictionary:mutableParameters];
}

//账号 密码
//正式
static NSString *const userName = @"868f335328bf6ea61fc94448ed314ace";
static NSString *const password = @"ae6dc70d26e9315f370ebade3e86d21b";

//测试
static NSString *const userNameTest = @"55275437287d63252b80dc5a784b3b8f";
static NSString *const passwordTest = @"9e84aae218c57cdf0762763c4cf5a651";

- (AFHTTPSessionManager *)buildSessionManager{
    
    return [self buildSessionManager:NO];
}

- (AFHTTPSessionManager *)buildSessionManager:(BOOL)isJsonParameter{
    
    NSURL *url = [NSURL URLWithString:self.baseUrl];
    AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
    
    //设置超时时间为10秒
    [sessionManager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    sessionManager.requestSerializer.timeoutInterval = 10.f;
    [sessionManager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    
    
    if (isJsonParameter) {
        sessionManager.requestSerializer = [AFJSONRequestSerializer serializerWithWritingOptions:0];
    }
    
    // 使用系统cookie管理 2017年5月18日  因为改动cart需要使用cookie
//    [[KWMUserDao shareDao] checkSession];
    sessionManager.requestSerializer.HTTPShouldHandleCookies = YES;
    
    sessionManager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
    //测试
    if([TestModel isEqualToString:@"YES"]){
        [sessionManager.requestSerializer setAuthorizationHeaderFieldWithUsername:userNameTest password:passwordTest];
    }
    //正式
    else{
        [sessionManager.requestSerializer setAuthorizationHeaderFieldWithUsername:userName password:password];
    }
    return sessionManager;
}



- (NSURLSessionDataTask *)startSessionTask:(KWMHTTPMethod)httpMethod
                                   apiPath:(NSString *)apiPath
                                parameters:(NSDictionary *)parameters
                                 filePaths:(NSDictionary *)filePaths
                                    images:(NSArray *)images
                             jsonParameter:(BOOL)isJsonParameter
                                    result:(Class)result
                                     model:(Class)model
                                   success:(void (^)(NSURLSessionDataTask *task, id result))success
                                   failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure{
    
    
    NSAssert((result == [KWMRequestResult class] || result == [KWMRequestListResult class]
              || result == [KWMCheckoutPayResult class]
              || result == [KWMCemaroseResult class] || [result isSubclassOfClass:[KWMCemaroseResult class]]),
             @"result class must either be KWMRequestResult or KWMRequestListResult!");
    NSAssert((!model || (model && [model isSubclassOfClass:[JSONModel class]])),
             @"model class must be sub class of JSONModel");
    
    void(^successCallback)(NSURLSessionDataTask *, id ) = [self buildSuccessCallbackWithResultClass:result
                                                                                         modelClass:model
                                                                                            success:success
                                                                                            failure:failure];
    AFHTTPSessionManager *sessionManager = [self buildSessionManager:isJsonParameter];
    //app version code
//    static NSString *KEY_VERSION_CODE = @"version_code";
//    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    NSMutableDictionary *mutableParameters = [[NSMutableDictionary alloc] initWithDictionary:parameters];
//    mutableParameters[KEY_VERSION_CODE] = build;
    
    //os_version统一添加
//    static NSString *KEY_OS_VERSION = @"os_version";
//    mutableParameters[KEY_OS_VERSION] = [NSString stringWithFormat:@"ios%@", [UIDevice currentDevice].systemVersion];
    //    NSLog(@"os_version:%@=====", mutableParameters[KEY_OS_VERSION]);
    
    
    if (filePaths != nil && filePaths.count > 0) {
        return [sessionManager POST:apiPath parameters:mutableParameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            
            NSFileManager *fileManager = [NSFileManager defaultManager];
            NSEnumerator *e = [filePaths keyEnumerator];
            for (NSString *key in e) {
                NSString *filePath = filePaths[key];
                
                if (![KWMStringUtil isEmpty:filePath]) {
                    if ([fileManager fileExistsAtPath:filePath]) {
                        [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath]
                                                   name:key
                                                  error:nil];
                    }else if([filePath sam_containsString:@"http"]){//网络图片
                        NSURL *url = [[NSURL alloc] initWithString:filePath];
                        [formData appendPartWithFileURL:url
                                                   name:key
                                                  error:nil];
                    }
                    
                }
            }
        } success:successCallback failure:failure];
    }
    
    if (images != nil && images.count > 0) {
        return [sessionManager POST:apiPath parameters:mutableParameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            
            NSFileManager *fileManager = [NSFileManager defaultManager];
            for (NSInteger i = 0; i < images.count; i++) {
                NSString *filePath = images[i];
                
                if (![KWMStringUtil isEmpty:filePath]
                    && [fileManager fileExistsAtPath:filePath]) {
                    
                    if (images.count == 1) {
                        [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath]
                                                   name:@"image"
                                                  error:nil];
                    }else{
                        [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath]
                                                   name:[NSString stringWithFormat:@"image%@", @(i+1)]
                                                  error:nil];
                    }
                }
            }
        } success:successCallback failure:failure];
    }
    
    if(parameters.allKeys==nil || parameters.allKeys.count==0){
        parameters = nil;
    }
    
    switch (httpMethod) {
        case KWMHTTPMethodGET:{
            return [sessionManager GET:apiPath parameters:parameters success:successCallback failure:failure];
        }
        case KWMHTTPMethodPOST:{
            return [sessionManager POST:apiPath parameters:parameters success:successCallback failure:failure];
        }
        case KWMHTTPMethodPUT:{
            return [sessionManager PUT:apiPath parameters:parameters success:successCallback failure:failure];
        }
        case KWMHTTPMethodDELETE:{
            return [sessionManager DELETE:apiPath parameters:parameters success:successCallback failure:failure];
        }
        default:{
            NSString *reason = [[NSString alloc] initWithFormat:@"Don't use this way to build your NSURLSessionDataTask!"];
            NSAssert(NO, reason);
            return nil;
        }
    }
    
    
    
}


- (NSURLSessionDataTask *)startSessionTask:(KWMHTTPMethod)httpMethod
                                   apiPath:(NSString *)apiPath
                                parameters:(NSDictionary *)parameters
                                 filePaths:(NSDictionary *)filePaths
                             jsonParameter:(BOOL)isJsonParameter
                                    result:(Class)result
                                     model:(Class)model
                                   success:(void (^)(NSURLSessionDataTask *task, id result))success
                                   failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
    
    return [self startSessionTask:httpMethod
                          apiPath:apiPath
                       parameters:parameters
                        filePaths:filePaths
                           images:nil
                    jsonParameter:isJsonParameter
                           result:result
                            model:model
                          success:success
                          failure:failure];
}

- (NSURLSessionDataTask *)makeSessionTask:(KWMHTTPMethod)httpMethod
                                   apiPath:(NSString *)apiPath
                                parameters:(NSDictionary *)parameters
                                    result:(Class)result
                                     model:(Class)model
                                   success:(void (^)(NSURLSessionDataTask *task, id result))success
                                   failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
    
    void(^successCallback)(NSURLSessionDataTask *, id ) = [self buildSuccessCallbackWithResultClass:result
                                                                                         modelClass:model
                                                                                            success:success
                                                                                            failure:failure];
    AFHTTPSessionManager *sessionManager = [self buildSessionManager:NO];
    NSString *method = httpMethod == KWMHTTPMethodPOST ? @"POST" : @"GET";
    NSURLRequest *request = [sessionManager.requestSerializer requestWithMethod:method URLString:apiPath parameters:parameters error:nil];
    __block id task = [sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        if (error) {
            failure(task,error);
        }else{
            successCallback(task,responseObject);
        }
    }];
    return task;
}

- (NSURLSessionDataTask *)startSessionTask:(KWMHTTPMethod)httpMethod
                                   apiPath:(NSString *)apiPath
                                parameters:(NSDictionary *)parameters
                                    result:(Class)result
                                     model:(Class)model
                                   success:(void (^)(NSURLSessionDataTask *task, id result))success
                                   failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure {
    return [self startSessionTask:httpMethod
                          apiPath:apiPath
                       parameters:parameters
                        filePaths:nil
                    jsonParameter:NO
                           result:result
                            model:model
                          success:success failure:failure];
}

- (NSString *)toIds:(NSArray<__kindof NSString *> *)idsArray {
    NSMutableString *tmp = [NSMutableString new];
    for (NSString *s in idsArray) {
        [tmp appendFormat:@"%@,", s];
    }
    
    if (tmp.length > 0) {
        return [tmp substringToIndex:tmp.length - 1];
    }else{
        return @"";
    }
}

- (void)loginWebSuccess:(void (^)())success failure:(void (^)(NSError *))failure {
    KWMUserModel *user= [KWMUserModel shareUser];
    NSString *account = user.email;
    NSString *password = user.password;
    if (!password) {
        password = [SAMKeychain passwordForService:@"cemarose.account" account:account];
    }
    // 没登陆过不做处理
    if (!password) {
        return;
    }
    NSLog(@"loginTask username:%@,password:%@",account,password);
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];
    [manager setTaskWillPerformHTTPRedirectionBlock:^NSURLRequest * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task, NSURLResponse * _Nonnull response, NSURLRequest * _Nonnull request) {
        NSString *url = request.URL.absoluteString;
        if ([url isEqualToString:[NSString stringWithFormat:@"https://%@/account",Shopify_SHOP_DOMAIN]]) {
            if(success) success();
        }else{
            NSError *error = [[NSError alloc] initWithDomain:url code:401 userInfo:@{NSLocalizedDescriptionKey:@"email & password is invalid !"}];
            if(failure) failure(error);
        }
        return nil;
    }];
    NSString *loginUrl = [NSString stringWithFormat:@"https://%@/account/login",Shopify_SHOP_DOMAIN];
    id param = @{
                @"from_type":@"customer_login",
                @"utf8":@"✓",
                @"customer[email]":account,
                @"customer[password]":password,
                 };
    [manager POST:loginUrl parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if(failure) failure(error);
    }];
    
}

/**
 * 手机登录API
 * @param parameters {mobile=?手机号,code=?收到的短信验证码}
 * @param success 成功callback
 * @param failure 失败callback
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) phoneLogin:(NSDictionary *)parameters
                                success:(void(^)(NSURLSessionDataTask *task,KWMCustomerResult *result))success
                                failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{

    NSString *apiPath = [NSString stringWithFormat:@"/shopifyapps/china_social_login/%@/api-check-code",Cemarose_KEY];
    
    return [self startSessionTask:KWMHTTPMethodPOST
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMCustomerResult class]
                            model:[KWMCustomer class]
                          success:success
                          failure:failure];
}

#pragma mark - 购物车接口

- (NSURLSessionDataTask *)changeProductWithVariantId:(NSNumber *)variantId quantity:(NSInteger) quantity success:(void (^)(NSURLSessionDataTask *, KWMCartResult *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure {
    NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart/change/%@.js",Shopify_SHOP_DOMAIN,variantId];
    id params = @{ @"quantity": @(quantity) };
    return [self makeSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:params result:[KWMCartResult class] model:nil success:success failure:failure];
}

- (NSURLSessionDataTask *)updateProductWithVariantIds:(NSArray<NSNumber *> *)variantIds quantities:(NSArray<NSNumber *> *)quantities success:(void (^)(NSURLSessionDataTask *, KWMCartResult *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure {
    NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart/update.js",Shopify_SHOP_DOMAIN];
    NSMutableDictionary *params = [NSMutableDictionary new];
    for (int i=0; i<quantities.count; i++) {
        [params setObject:quantities[i] forKey:[NSString stringWithFormat:@"updates[%@]",variantIds[i]]];
    }
    return [self makeSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:params result:[KWMCartResult class] model:nil success:success failure:failure];
}

- (NSURLSessionDataTask *)addProductWithVariantId:(NSNumber *)variantId quantity:(NSInteger)quantity success:(void (^)(NSURLSessionDataTask *, KWMRequestResult *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure {
    NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart/add.js",Shopify_SHOP_DOMAIN];
    id params = @{
                  @"id":variantId,
                  @"quantity":@(quantity),
                  };
    return [self makeSessionTask:KWMHTTPMethodPOST apiPath:apiPath parameters:params result:[KWMDictionaryResult class] model:nil success:success failure:failure];
}

-(NSURLSessionDataTask *)getCartSuccess:(void (^)(NSURLSessionDataTask *, KWMCartResult *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure {
    NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart.js",Shopify_SHOP_DOMAIN];
    return [self makeSessionTask:KWMHTTPMethodGET apiPath:apiPath parameters:nil result:[KWMCartResult class] model:nil success:success failure:failure];
}

- (NSURLSessionDataTask *)tmpCartWithVariantId:(NSNumber *)variantId quantity:(NSInteger)quantity success:(void (^)(NSURLSessionDataTask *, NSString *))success failure:(void (^)(NSURLSessionDataTask *, NSError *))failure {
    NSString *apiPath = [NSString stringWithFormat:@"https://%@/cart/add.js",Shopify_SHOP_DOMAIN];
    id params = @{
                @"id":variantId,
                @"quantity":@(quantity),
                };
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager.requestSerializer setHTTPShouldHandleCookies:NO];
    NSString *cookie = [[KWMHttpUtil buildRequestCookieString] stringByReplacingOccurrencesOfRegex:@"cart=.*?; ?" withString:@""];
    [manager.requestSerializer setValue:cookie forHTTPHeaderField:@"Cookie"];
    return [manager POST:apiPath parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
        NSString *cartCookie = [response.allHeaderFields[@"Set-Cookie"] stringByMatching:@"cart=(.*?);" capture:1];
        success(task,cartCookie);
    } failure:failure];
}

/**
 * 手机登录-获取短信API
 * @param parameters {mobile=?手机号}
 * @param success 成功callback
 * @param failure 失败callback
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) phoneSms:(NSDictionary *)parameters
                              success:(void(^)(NSURLSessionDataTask *task,KWMCemaroseResult *result))success
                              failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    
    NSString *apiPath = [NSString stringWithFormat:@"/shopifyapps/china_social_login/%@/api-verify-code",Cemarose_KEY];
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMCemaroseResult class]
                            model:nil
                          success:success
                          failure:failure];
    
}


/**
 * 获取所有品牌
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getAllBrand:(NSDictionary *)parameters
                            success:(void(^)(NSURLSessionDataTask *task,KWMBrandsResult *result))success
                            failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    
    NSString *apiPath = @"shopifyapps/product_search/cemarose/brands";
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMBrandsResult class]
                            model:nil
                          success:success
                          failure:failure];
}

/**
 * 搜索API
 * @param parameters {keyword=?搜索内容}
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) searchProduct:(NSDictionary *)parameters
                                 success:(void(^)(NSURLSessionDataTask *task,KWMSearchResult *result))success
                                 failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = @"shopifyapps/product_search/cemarose/search";
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                        parameters:parameters
                           result:[KWMSearchResult class]
                            model:nil
                          success:success
                          failure:failure];
}

/**
 * 博客API
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getAllBlog:(NSDictionary *)parameters
                              success:(void(^)(NSURLSessionDataTask *task,KWMBlogResult *result))success
                              failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure;{
     NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/articles.json",Shopify_SHOP_DOMAIN];
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMBlogResult class]
                            model:nil
                          success:success
                          failure:failure];
}

/**
 * 商品——新品API
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getNewProducts:(NSDictionary *)parameters
                                  success:(void(^)(NSURLSessionDataTask *task,KWMNewProducts *result))success
                                  failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = @"https://ogbgohpla.qnssl.com/App.Home.New.json";

    NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]/100;
    long long  time = interval;
    apiPath = [[NSString alloc] initWithFormat:@"%@?_=%llu", apiPath, time];
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMNewProducts class]
                            model:[KWMNewGoodsModel class]
                          success:success
                          failure:failure];
}

/**
 * 商品——打折API
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getDiscountProducts:(NSDictionary *)parameters
                                  success:(void(^)(NSURLSessionDataTask *task,KWMNewProducts *result))success
                                  failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = @"https://ogbgohpla.qnssl.com/App.Home.SALE.json";
    
    NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]/100;
    long long  time = interval;
    apiPath = [[NSString alloc] initWithFormat:@"%@?_=%llu", apiPath, time];
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMNewProducts class]
                            model:[KWMNewGoodsModel class]
                          success:success
                          failure:failure];
    }

/**
 * 获取商品分类API
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getProductTypes:(NSDictionary *)parameters type:(NSInteger)type
                                   success:(void(^)(NSURLSessionDataTask *task,KWMProductTypeResult *result))success
                                   failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    
    NSString *apiPath = @"https://ogbgohpla.qnssl.com/Baby.Navigation.json";
    if(type == 0){
        apiPath = @"https://ogbgohpla.qnssl.com/Baby.Navigation.json";
    }else if(type == 1){
        apiPath = @"https://ogbgohpla.qnssl.com/Girls.Navigation.json";
    }else if(type == 2){
        apiPath = @"https://ogbgohpla.qnssl.com/Boys.Navigation.json";
    }else if(type == 3){
        apiPath = @"https://ogbgohpla.qnssl.com/Shoes.Navigation.json";
    }
    
    NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]/100;
    long long  time = interval;
    apiPath = [[NSString alloc] initWithFormat:@"%@?_=%llu", apiPath, time];
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMProductTypeResult class]
                            model:[KWMProductType class]
                          success:success
                          failure:failure];
}
    

/**
 * 品牌类型--API
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getBrandsType:(NSDictionary *)parameters
                                       success:(void(^)(NSURLSessionDataTask *task,KWMBrandsTypeResult *result))success
                                       failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = @"https://ogbgohpla.qnssl.com/Designers.json";
    
    NSTimeInterval interval = [[NSDate date] timeIntervalSince1970]/100;
    long long  time = interval;
    apiPath = [[NSString alloc] initWithFormat:@"%@?_=%llu", apiPath, time];
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMBrandsTypeResult class]
                            model:[KWMBrandsTypeModel class]
                          success:success
                          failure:failure];
}


/**
 * 汇率--API
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getExchangeRate:(NSDictionary *)parameters
                                 success:(void(^)(NSURLSessionDataTask *task,KWMExchangeRateResult *result))success
                                 failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
#if DEBUG
    NSString *apiPath = @"https://liang.tofnews.com/app/exchange/rate";
#else
    NSString *apiPath = @"https://apps.cemarose.com/app/exchange/rate";
#endif
//    NSString *sign = [KWMStringUtil MD5:[KWMStringUtil BASE64:@"currency=EUR&key=bd3f58f5cd3d7a217ac8c8e655ab52f8"]];
//    NSLog(@"rate sign: %@",sign);
//    NSDictionary *params = @{@"currency":@"EUR",@"sign":sign};
    NSDictionary *params = @{@"currency":@"EUR",@"sign":@"665d9716511eb11f68a1a7a862ed2ddd"};
    
    return [self startSessionTask:KWMHTTPMethodPOST
                          apiPath:apiPath
                       parameters:params
                           result:[KWMExchangeRateResult class]
                            model:nil
                          success:success
                          failure:failure];
}



/**
 * 获取相关图片api
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getProductImages:(NSDictionary *)parameters productId:(NSNumber *)productId
                                    success:(void(^)(NSURLSessionDataTask *task,KWMImagesResult *result))success
                                    failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
   
    NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/products/%@/metafields.json",Shopify_SHOP_DOMAIN,productId.stringValue];
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMImagesResult class]
                            model:[KWMImage class]
                          success:success
                          failure:failure];
}

/**
 * 获取获取某个订单api
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getAdminOrder:(NSDictionary *)parameters orderId:(NSNumber *)orderId
                                    success:(void(^)(NSURLSessionDataTask *task,KWMOrdersResult *result))success
                                    failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    
    NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/orders.json?ids=%@",Shopify_SHOP_DOMAIN,orderId.stringValue];
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMOrdersResult class]
                            model:[KWMOrder class]
                          success:success
                          failure:failure];
}

/**
 * 获取商品api,因為admin商品有剩余库存数量字段,所以商品詳細還需要請求此api。
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) getAdminProduct:(NSDictionary *)parameters productId:(NSNumber *)productId
                                    success:(void(^)(NSURLSessionDataTask *task,KWMProductResult *result))success
                                    failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    
    NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/products/%@.json",Shopify_SHOP_DOMAIN,productId.stringValue];
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMProductResult class]
                            model:[KWMProduct class]
                          success:success
                          failure:failure];
}

/**
 * 取消订单api
 * amount 退款金额 (default: false)(十进制:21.20)If set, Shopify will attempt to void/refund the payment depending on the status.
 * restock 是否将此订单商品重新包装会商店 (default: false)
 * reason 订单取消原因 (用户customer, 库存inventory, 假货fraud, 其他other)(default: other)
 * email 发送邮箱通知用户 (default: false)
 * refund 更复杂的退款方式 As specified in the Refund documentation. Required for some more complex refund situations.
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) cancelOrder:(NSDictionary *)parameters orderId:(NSNumber *)orderId
                                   success:(void(^)(NSURLSessionDataTask *task,KWMProductResult *result))success
                                   failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = [[NSString alloc] initWithFormat:@"https://%@/admin/orders/%@/cancel.json",Shopify_SHOP_DOMAIN,orderId.stringValue];
    
    return [self startSessionTask:KWMHTTPMethodGET
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMCemaroseResult class]
                            model:nil
                          success:success
                          failure:failure];
}


/**
 * 微信统一下单API
 * checkout_token shopify订单token
 * total_price 订单总金额
 * ip_address 手机IP
 * subject 订单描述
 * sign 签名验证
 * 签名规则
 * str_sign = "ip_address=127.0.0.1&checkout_token=5173547165345&subject=test&total_price=23423&key=bd3f58f5cd3d7a217ac8c8e655ab52f8";
 * sign = md5(base64_encode($str_sign));
 *
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) wechatPayUnifiedOrder:(NSDictionary *)parameters
                                         success:(void(^)(NSURLSessionDataTask *task,KWMCheckoutPayResult *result))success
                                         failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = @"https://peter.tofnews.com/wechatpay/app/unified_order";
    
    return [self startSessionTask:KWMHTTPMethodPOST
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMCheckoutPayResult class]
                            model:[KWMWechatPayData class]
                          success:success
                          failure:failure];
}

/**
 * 支付宝统一下单API
 * checkout_token shopify订单token
 * total_price 订单总金额
 * subject 订单描述
 * sign 签名验证
 * 签名规则
 * str_sign = checkout_token=5173547165345&subject=test&total_price=23423&key=bd3f58f5cd3d7a217ac8c8e655ab52f8";
 * sign = md5(base64_encode($str_sign));
 *
 * @return NSURLSessionDataTask
 */
- (NSURLSessionDataTask *) aliPayUnifiedOrder:(NSDictionary *)parameters
                                      success:(void(^)(NSURLSessionDataTask *task,KWMCheckoutPayResult *result))success
                                      failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = @"https://peter.tofnews.com/alipay/app/unified_order";
    
    return [self startSessionTask:KWMHTTPMethodPOST
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMCheckoutPayResult class]
                            model:nil
                          success:success
                          failure:failure];
}

- (NSURLSessionDataTask *) wechatPayOrderQuery:(NSDictionary *)parameters
                                       success:(void(^)(NSURLSessionDataTask *task,KWMCheckoutPayResult *result))success
                                       failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = @"https://peter.tofnews.com/wechatpay/order/query";
    
    return [self startSessionTask:KWMHTTPMethodPOST
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMCheckoutPayResult class]
                            model:nil
                          success:success
                          failure:failure];
}

- (NSURLSessionDataTask *) aliPayOrderQuery:(NSDictionary *)parameters
                                    success:(void(^)(NSURLSessionDataTask *task,KWMCheckoutPayResult *result))success
                                    failure:(void(^)(NSURLSessionDataTask *task,NSError *error))failure{
    NSString *apiPath = @"https://peter.tofnews.com/alipay/order/query";
    
    return [self startSessionTask:KWMHTTPMethodPOST
                          apiPath:apiPath
                       parameters:parameters
                           result:[KWMCheckoutPayResult class]
                            model:nil
                          success:success
                          failure:failure];
}



@end