//
//  KWMUserDao.m
//  iOrangeBusiness
//
//  Created by Yaotian on 10/28/14.
//  Copyright (c) 2014 kwm. All rights reserved.
//

#import "KWMUserDao.h"
#import "KWMStringUtil.h"
#import "KWMUser.h"
#import "NSString+SAMAdditions.h"
#import "KWMAPIManager.h"
#import "AppDelegate.h"
//#import "JPUSHService.h"
#import "PSPDFAlertView.h"
#import "KWMStringUtil.h"
//#import <Mobile-Buy-SDK/Buy/BUYClient.h>
#import "KWMUserModel.h"
#import <SAMKeychain/SAMKeychain.h>

#define SESSID                          @"PHPSESSID"
static NSString *kwmKeySessionId = @"sessionId";
static NSString *kwmKeyUser = @"KWMUser";
static NSString *kwmKeyExchangeRate = @"KWMExangeRate";
static NSString *kwmKeyCheckoutCache = @"KWMCheckoutCache";
static NSString *kwmKeySavedAccountPassword = @"savedAccountPassword";
//static NSString *secretKey = @"!@#EQRGEQ$#Y%>O:";

@interface KWMUserDao ()


@end

@implementation KWMUserDao {
    
    KWMUser *current;
    NSString *sessionId;
    NSString *hxAccount;
    NSString *hxPassword;
    NSDictionary *_savedAccountPassword;
    BOOL isSkipLoginChat;
    BOOL isLoginedChat;
    BOOL isLogingChat;
    NSDecimalNumber *_exchangeRate;
}

@synthesize customsClearance = _customsClearance;
@synthesize currencyCode = _currencyCode;


+ (KWMUserDao *)shareDao {
    static KWMUserDao *_userDao = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _userDao =[[self alloc] init];
        //        _userDao->isSkipLoginChat = NO;
        //#ifdef DEBUG
        //        _userDao->isSkipLoginChat = YES;
        //#endif
        
        [[NSNotificationCenter defaultCenter] addObserverForName:KWMReceiverNoLogin
                                                          object:nil
                                                           queue:[NSOperationQueue mainQueue]
                                                      usingBlock:^(NSNotification * _Nonnull note) {
                                                          
                                                          if ([_userDao isLogin]) {
                                                              [_userDao logout];
                                                              AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
//                                                              [app toLogin];
                                                          }
                                                      }];
    });
    return _userDao;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:KWMReceiverNoLogin
                                                  object:nil];
}

- (BOOL)checkSession {
    if ([KWMStringUtil isEmpty:sessionId]) {
        NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
        sessionId = [defaults objectForKey:kwmKeySessionId];
    }
    
    [self updateSession:sessionId];
    return ![KWMStringUtil isEmpty:sessionId];
}

- (void)deleteSession {
    //#ifdef DEBUG
    //    NSAssert(NO, @"不许登出");
    //#endif
    sessionId = @"";
    
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    [defaults setObject:@"" forKey:kwmKeySessionId];
    [defaults synchronize];
}


- (void)saveSession:(NSString *)value {
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];

    sessionId = value;
    [defaults setObject:value forKey:kwmKeySessionId];
    [defaults synchronize];
}

- (void)saveImageUrl:(NSString *)imageUrl key:(NSString *)key{
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    [defaults setObject:imageUrl forKey:key];
    [defaults synchronize];
}

- (NSString *)getImageUrl:(NSString *)key{
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    NSString *exists = [defaults objectForKey:key];
    if (![KWMStringUtil isEmpty:exists]) {
        return exists;
    }else{
        return @"";
    }
}

- (void)login {
    
    KWMUserModel *user= [KWMUserModel shareUser];
    NSString *account = user.email;
    NSString *password = user.password;
    if (!password) {
        password = [SAMKeychain passwordForService:@"cemarose.account" account:account];
    }
    if (!(account && password)) {
        return;
    }
    NSArray *items = @[
                       [BUYAccountCredentialItem itemWithEmail:account],
                       [BUYAccountCredentialItem itemWithPassword:password],
                       ];
    BUYAccountCredentials *credentials = [BUYAccountCredentials credentialsWithItems:items];
//    [weakSelf requestLoginAPI:credentials];
    [self.client loginCustomerWithCredentials:credentials callback:^(BUYCustomer * _Nullable customer, BUYCustomerToken * _Nullable token, NSError * _Nullable error) {
        if (customer && token && !error) {
            [KWMUserModel saveAccountByCredentials:credentials];
            _customer = customer;
//            _token = token;
//            _userModel.customerJSON = customer.JSONDictionary;
//            _userModel.tokenJSON = token.JSONDictionary;
            
            //异步保存数据
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
//                [self saveData];
//                [_userModel login];
                
                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                [defaults setObject:_customer.JSONDictionary forKey:@"customer"];
                [defaults setObject:token.JSONDictionary forKey:@"token"];
                [defaults synchronize];
                [[KWMAPIManager sharedManager] loginWebSuccess:nil failure:nil];
            });
            
        }else{
            NSLog(@"requestLoginAPI error: %@",error);
            [user logout];
            [self logout];
        }
    }];
    
    
}

- (KWMUser *)loginUser {
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    NSString *userJSON = [defaults objectForKey:kwmKeyUser];
    NSData *jsonData = userJSON != nil ? [userJSON dataUsingEncoding:NSUTF8StringEncoding] : nil;
    if (jsonData) {
        NSError *error;
        NSDictionary *userDict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error];
        if (!error) {
            KWMUser *tmpUser = [[KWMUser alloc]initWithDictionary:userDict error:&error];
            if (!error && [tmpUser isValidated]) {
                current = tmpUser;
            }
        }
    }
    return current;
}

- (void)setLoginUser:(KWMUser *)user session:(NSString *)session{
    current = user;
    
    if (current == nil || ![current isValidated]) {
        [self logout];
        return;
    }
    [self saveUser:user];
    [self saveSession:session];
}

- (void)saveUser:(KWMUser *)user {
    NSString *userJSON = user.toJSONString;
    
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    [defaults setObject:userJSON forKey:kwmKeyUser];
    [defaults synchronize];
//    [self registerJpush];
}


- (void)deleteUser {
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    [defaults removeObjectForKey:kwmKeyUser];
}

- (BUYClient *)client {
    if (_client == nil){
        _client = [[BUYClient alloc] initWithShopDomain:Shopify_SHOP_DOMAIN
                                                 apiKey:Shopify_API_KEY
                                                  appId:Shopify_APP_ID];
        
    }
    _client.pageSize = 20;
    NSDictionary *tokenDic = [[NSUserDefaults standardUserDefaults] objectForKey:@"token"];
    NSString *path = NSHomeDirectory();//主目录
    NSLog(@"NSHomeDirectory:%@",path);
    if (tokenDic != nil) {
        BUYCustomerToken *token = [BUYCustomerToken customerTokenWithJSONDictionary:[[NSUserDefaults standardUserDefaults] objectForKey:@"token"]];
        if (token != nil) {
            _client.customerToken = token;
        }
    }
    return _client;
}

-(BUYCustomer *)customer {
    if (!_customer) {
        NSDictionary *customerDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"customer"];
        _customer = [[BUYCustomer alloc] initWithModelManager:self.client.modelManager JSONDictionary:customerDict];
    }
    return _customer;
}

-(void)requestTags {
    [[KWMAPIManager sharedManager] adminUserSuccess:^(NSURLSessionDataTask *task, KWMDictionaryResult *result) {
        NSString *tags = result.data[@"customer"][@"tags"];
        self.tags = [tags componentsSeparatedByString:@", "];
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"%@",error);
    }];
}

-(NSDictionary *)checkOutCache{
    NSString *filePath = [self getCheckoutCachePath];
    // 解档
    NSData *cacheData = [NSData dataWithContentsOfFile:filePath];

    if(!cacheData){
        return nil;
    }
    
    NSDictionary *checkout = [NSJSONSerialization JSONObjectWithData:cacheData options:NSJSONReadingMutableContainers error:nil];

    return checkout;
    
//    if(checkout){
//        return [[BUYModelManager modelManager] insertCheckoutWithJSONDictionary:checkout];
//    }else{
//        return nil;
//    }
}

-(void)saveCheckoutCache:(NSDictionary *)dictionary{
    if(dictionary){
        
        NSData *cacheData =  [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil];

        if([cacheData writeToFile:[self getCheckoutCachePath] atomically:YES]){
            NSLog(@"订单缓存成功");
        }else{
            NSLog(@"订单缓存失败");
        }
    }
    
}

-(void)deleteCheckoutCache{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL isDelete=[fileManager removeItemAtPath:[self getCheckoutCachePath] error:nil];
}

- (void)saveExchangeRate:(NSNumber *)exchangeRate {
    if(exchangeRate == nil){
        return;
    }
    _exchangeRate = [NSDecimalNumber decimalNumberWithDecimal:exchangeRate.decimalValue];
    NSString *exchangeString = exchangeRate.stringValue;
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    [defaults setObject:exchangeString forKey:kwmKeyExchangeRate];
    [defaults synchronize];
}

- (NSDecimalNumber *)exchangeRate {
    if (!_exchangeRate) {
        NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
        NSString *exchageRateString = [defaults objectForKey:kwmKeyExchangeRate];
        //    NSNumber *rate = [KWMStringUtil stringToNumber:exchageRateString];
        //    return rate;
        if ([KWMStringUtil isEmpty:exchageRateString]) {
            _exchangeRate = [NSDecimalNumber decimalNumberWithString:ExchangeRateString];
        } else {
            _exchangeRate = [NSDecimalNumber decimalNumberWithString:exchageRateString];
        }
    }
    return _exchangeRate;
}

-(void)saveCollectionCache:(NSArray *)products collectionId:(NSNumber *)collectionId tags:(NSArray *)tags{
    if(!products || products.count == 0){
        return;
    }
    if(!collectionId){
        return;
    }
    //初始化用于保存数据的key
    NSString *filePath= [self getCollectionCachePath:collectionId tags:tags];
    
    //用于保存的字典列表
    NSMutableArray *cacheArray =[NSMutableArray arrayWithCapacity:20];
    for(BUYProduct *product in products){
        if(product.JSONDictionary!=nil){
            [cacheArray addObject:product.JSONDictionary];
        }
    }
    if (![cacheArray writeToFile:filePath atomically:YES]){
        NSLog(@"缓存失败");
    }
}

-(NSArray *)getCollectionCache:(NSNumber *)collectionId tags:(NSArray *)tags{
    NSString *filePath = [self getCollectionCachePath:collectionId tags:tags];
    // 解档
    NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
    if(!arr||arr.count == 0){
        return nil;
    }
    NSArray *cacheArr = [[BUYModelManager modelManager] insertProductsWithJSONArray:arr];
    return cacheArr;
}


-(NSString *)getCollectionCachePath:(NSNumber *)collectionId tags:(NSArray *)tags{
    if(!collectionId){
        return @" ";
    }
    //初始化用于保存数据的key
    NSString *key =collectionId.stringValue;
    if(tags && tags.count>0){
        for(NSString *tag in tags){
            key = [NSString stringWithFormat:@"%@、%@",key,tag];
        }
    }
    NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
    NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",key]];
    return filePath;
}

-(NSString *)getCheckoutCachePath{
    NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
    NSString *filePath = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",kwmKeyCheckoutCache]];
    return filePath;
}

- (BOOL)isLogin {
    return [self.loginUser isValidated] && [self checkSession];
}

- (void)logout{
    [self deleteSession];
//    [self unRegisterJpush];
    [self deleteUser];
    //    [self logoutChat];
}

#pragma mark DES encrypt & decrypt

/**
 *  DES加密
 *
 *  @param plain data
 *
 *  @return secret data
 */
//- (NSData *)DES_Encrypt:(NSData *)plainData{
//    if (!plainData) {
//        return plainData;
//    }
//
//    NSData *keyData = [secretKey dataUsingEncoding:NSASCIIStringEncoding];
//    Byte iv[]={0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
//    NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
//
//    NSData *secretData = [STEncryptorDES encryptData:plainData key:keyData iv:ivData];
//    return secretData;
//}

/**
 *  DES解密
 *
 *  @param secret data
 *
 *  @return plain data
 */
//- (NSData *)DES_DEcrypt:(NSData *)secretData{
//    if (!secretData) {
//        return secretData;
//    }
//
//    NSData *keyData = [secretKey dataUsingEncoding:NSASCIIStringEncoding];
//    Byte iv [] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};
//    NSData *ivData = [NSData dataWithBytes:iv length:sizeof(iv)];
//    NSData *plainData = [STEncryptorDES decryptData:secretData key:keyData iv:ivData];
//    return plainData;
//}

#pragma mark JPush
//
//-(void)registerJpush{
//    NSString *alias = [KWMStringUtil MD5:[NSString stringWithFormat:@"%@", self.loginUser.id.stringValue]];
//    
//    NSSet *tags = [NSSet setWithArray:@[]];
//    //注册极光推送
//    [JPUSHService setTags:nil alias:alias callbackSelector:@selector(registerCallbackJpushAlias:tags:alias:) object:self];
//}
//
//-(void)unRegisterJpush{
//    //反注册极光推送
//    NSString *alias = @"";
//    NSSet *tags = [NSSet setWithArray:@[]];
//    [JPUSHService setTags:nil alias:alias callbackSelector:@selector(unRegisterCallbackJpushAlias:tags:alias:) object:self];
//}
//
//- (void)registerCallbackJpushAlias:(int)iResCode tags:(NSSet*)tags alias:(NSString*)alias {
//    if(iResCode == 6002){//如果返回 6002 (超时)则建议重试
//        [self registerJpush];
//        return;
//    }
//    
//    NSLog(@"++++registerJpush: registrationID=%@", [JPUSHService registrationID]);
//}
//
//- (void)unRegisterCallbackJpushAlias:(int)iResCode tags:(NSSet*)tags alias:(NSString*)alias {
//    if(iResCode == 6002){//如果返回 6002 (超时)则建议重试
//        [self unRegisterJpush];
//        return;
//    }
//}

#pragma mark login session

- (void (^)(NSURLSessionDataTask *, KWMRequestResult *))getLoginSuccessCallback:(void (^)(NSURLSessionDataTask *task, KWMRequestResult *result))callback {
    
    __weak KWMUserDao *weakSelf = self;
    void (^success)(NSURLSessionDataTask *, KWMRequestResult *) =
    ^(NSURLSessionDataTask *task, KWMRequestResult *result) {
        BOOL isSuccess = result != nil && result.code == 0;
        if (isSuccess) {
            KWMUser *user = (KWMUser *)result.data;
            if (user != nil) {
                [weakSelf fetchSession:(NSHTTPURLResponse *)task.response user:user];
            }
        }
        
        if (callback != nil) {
            callback(task, result);
        }
    };
    return success;
}


- (void)fetchSession:(NSHTTPURLResponse *)httpResponse user:(KWMUser *)user {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray<NSHTTPCookie *> *cookies = cookieStorage.cookies;
    for (NSHTTPCookie *cookie in cookies) {
        if ([SESSID isEqualToString:cookie.name] && [API_HOST isEqualToString:cookie.domain]) {
            NSString *session = cookie.value;
            KWMUserDao *userDao = [KWMUserDao shareDao];
            [userDao setLoginUser:user session:session];
            break;
        }
    }
}

- (void)updateSession:(NSString *)session {
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray<NSHTTPCookie *> *cookies = cookieStorage.cookies;
    //delete if empty
    if ([KWMStringUtil isEmpty:session]) {
        for (NSHTTPCookie *cookie in cookies) {
            [cookieStorage deleteCookie:cookie];
        }
        return;
    }
    
    BOOL isExists = NO;
    //1.check if exists
    for (NSHTTPCookie *cookie in cookies) {
        if ([SESSID isEqualToString:cookie.name]) {
            NSString *exists = cookie.value;
            isExists = [session isEqualToString:exists];
            break;
        }
    }
    
    //2.set session value
    if (!isExists) {
        for (NSHTTPCookie *cookie in cookies) {
            [cookieStorage deleteCookie:cookie];
        }
        
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{
                                                                    NSHTTPCookieName : SESSID,
                                                                    NSHTTPCookieValue : session,
                                                                    NSHTTPCookieDomain : API_HOST,
                                                                    NSHTTPCookiePath : @"/"
                                                                    }];
        [cookieStorage setCookie:cookie];
    }
}

-(NSString *)currencyCode {
    if (!_currencyCode) {
        _currencyCode = [[NSUserDefaults standardUserDefaults] stringForKey:@"_current_currency_code"];
        if (!_currencyCode) {
//            _currencyCode = [@"zh" isEqualToString:[[NSLocale currentLocale] languageCode]] ? @"CNY" : @"EUR";
            NSString *language = [[NSLocale preferredLanguages] firstObject];
            _currencyCode = [language isMatchedByRegex:@"^zh"] ? @"CNY" : @"EUR";
        }
    }
    return _currencyCode;
}

-(void)setCurrencyCode:(NSString *)currencyCode {
    _currencyCode = currencyCode;
    [[NSUserDefaults standardUserDefaults] setObject:currencyCode forKey:@"_current_currency_code"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

-(KWMCustomsClearance *)customsClearance{
    if(!_customsClearance){
        _customsClearance = [[NSUserDefaults standardUserDefaults] objectForKey:@"_customs_clearance"];
    }
    return _customsClearance;
}

-(void)setCustomsClearance:(KWMCustomsClearance *)customsClearance{
    _customsClearance = customsClearance;
    [[NSUserDefaults standardUserDefaults]setObject:customsClearance forKey:@"_customs_clearance"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

@end