//
// Created by Yaotian on 12/11/13.
// Copyright (c) 2013 Kollway Mobile. All rights reserved.
//

#import "KWMStringUtil.h"
#import <CommonCrypto/CommonDigest.h>
#import <SAMCategories/NSString+SAMAdditions.h>
#import "KWMUserDao.h"

static NSDateFormatter *yearMonthDayFormatter;
static NSDateFormatter *monthDayFormatter;

@implementation KWMStringUtil

+ (void)initialize {
    
    [super initialize];
    yearMonthDayFormatter = [[NSDateFormatter alloc] init];
    [yearMonthDayFormatter setDateFormat:@"yyyy-MM-dd"];
    
    monthDayFormatter = [[NSDateFormatter alloc] init];
    [monthDayFormatter setDateFormat:@"MM-dd"];
}

+ (NSString *)MD5:(NSString *)input {
    if(!input){
        return input;
    }
    return [input sam_MD5Digest];
}

+ (NSString *)BASE64:(NSString *)input {
    if(!input){
        return input;
    }
    return [input sam_base64EncodedString];
}


+ (BOOL)isEmpty:(NSString *)input {
    return [input isKindOfClass:[NSNull class]] || input == nil || [input length] <= 0;
}

+ (BOOL)isBlank:(NSString *)input {
    return [self isEmpty:input] ||
    ([[input stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0);
}

+ (BOOL)isNumberString:(NSString *)input {
    if([input isKindOfClass:[NSNull class]]){
        return NO;
    }
    if([KWMStringUtil isBlank:input]){
        return NO;
    }
    
    NSInteger len = input.length;
    for(int i = 0; i < len; i++){
        unichar c = [input characterAtIndex:i];
        if(!isnumber(c)){
            return NO;
        }
    }
    return YES;
}

+ (BOOL)isPhone:(NSString *)input {
    if([input isKindOfClass:[NSNull class]]){
        return NO;
    }
    if(! [KWMStringUtil isNumberString:input]){
        return NO;
    }
    
    NSInteger len = [input length];
    if(len != 11){
        return NO;
    }
    
    for(int i = 0; i < len; i++){
        unichar c = [input characterAtIndex:i];
        if(! isdigit(c)){
            return NO;
        }
    }
    
    return YES;
}

+ (NSString *)readableDateString:(NSDate *)date {
    static NSString *f = @"MM/dd";
    NSString *result = [KWMStringUtil dateToString:date format:f];
    if ([result isEqualToString:[KWMStringUtil dateToString:[NSDate date] format:f]]) {
        return @"今天";
    }
    return result;
}

+ (NSString *)readableTimeString:(NSDate *)date {
    NSCalendarUnit dateFlags = NSCalendarUnitYear|
    NSCalendarUnitMonth|
    NSCalendarUnitDay|
    NSCalendarUnitHour|
    NSCalendarUnitMinute|
    NSCalendarUnitSecond;
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *dateComponents = [gregorianCalendar components:dateFlags fromDate:date];
    NSDateComponents *nowComponents = [gregorianCalendar components:dateFlags fromDate:[NSDate new]];
    
    if((dateComponents.year < nowComponents.year)||
       (dateComponents.month < nowComponents.month)||
       (dateComponents.day < nowComponents.day)){
        return [KWMStringUtil yearMonthDateString:date];
    }
    
    NSInteger hourSub = nowComponents.hour - dateComponents.hour;
    if(hourSub > 0){
        return [[NSString alloc] initWithFormat:@"%@小时前", @(hourSub)];
    }
    
    NSInteger minuteSub = nowComponents.minute - dateComponents.minute;
    if(minuteSub > 0){
        return [[NSString alloc] initWithFormat:@"%@分钟前", @(minuteSub)];
    }
    
    NSInteger secondSub = nowComponents.second - dateComponents.second;
    if(secondSub > 5){
        return [[NSString alloc] initWithFormat:@"%@秒前", @(secondSub)];
    }else{
        return [[NSString alloc] initWithFormat:@"刚刚"];
    }
}

+(NSString *)dateFormatTimeString:(long long)time{
    //去除毫秒
    NSString *timeStr = [NSString stringWithFormat:@"%lld",time];
    if ([timeStr length] == 13) {
        time = time/1000;
    }
    //设置时间
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    
    NSDate *addTimesp = [NSDate dateWithTimeIntervalSince1970:time];
    return [KWMStringUtil readableTimeString:addTimesp];
}

+ (NSString *)yearMonthDateString:(NSDate *)date {
    return [yearMonthDayFormatter stringFromDate:date];
}

+ (NSString *)dateToString:(NSDate *)date format:(NSString *)formatStr {
    NSDateFormatter *f = [[NSDateFormatter alloc] init];
    [f setDateFormat:formatStr];
    return [f stringFromDate:date];
}

+ (NSDate *)stringToDate:(NSString *)dateStr format:(NSString *)formatStr {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone localTimeZone];
    [formatter setTimeZone:timeZone];
    [formatter setDateFormat:formatStr];
    return [formatter dateFromString:dateStr];
}


+ (NSString *)monthDateString:(NSDate *)date {
    return [monthDayFormatter stringFromDate:date];
}

//获取时间是星期几
+(NSString *)dateformatToWeek:(long long)time{
    NSArray * arrWeek=[NSArray arrayWithObjects:@"周日",@"周一",@"周二",@"周三",@"周四",@"周五",@"周六", nil];

    //去除毫秒
    NSString *timeStr = [NSString stringWithFormat:@"%lld",time];
    if ([timeStr length] == 13) {
        time = time/1000;
    }
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:time];
    NSCalendarUnit dateFlags = NSCalendarUnitWeekday;
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents *dateComponents = [gregorianCalendar components:dateFlags fromDate:date];
    NSInteger week = [dateComponents weekday];
    return [arrWeek objectAtIndex:week-1];
}

+(NSString *) dateformatToYear:(long long) time{
    
    //去除毫秒
    NSString *timeStr = [NSString stringWithFormat:@"%lld",time];
    if ([timeStr length] == 13) {
        time = time/1000;
    }
    //设置时间
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    
    NSDate *addTimesp = [NSDate dateWithTimeIntervalSince1970:time];
    NSString *addTimespStr = [formatter stringFromDate:addTimesp];
    return addTimespStr;
}

+(NSString *) dateformatToHours:(long long) time{
    
    //去除毫秒
    NSString *timeStr = [NSString stringWithFormat:@"%lld",time];
    if ([timeStr length] == 13) {
        time = time/1000;
    }
    //设置时间
    NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"HH:mm"];
    
    NSDate *addTimesp = [NSDate dateWithTimeIntervalSince1970:time];
    NSString *addTimespStr = [formatter stringFromDate:addTimesp];
    return addTimespStr;
}


+ (NSString *)getFileName:(NSString *)filePath {
    if([self isEmpty:filePath]){
        return @"";
    }
    
    return [filePath lastPathComponent];
}

+ (NSString *) trimPhoneNumber:(NSString *)string {
    NSCharacterSet * invalidNumberSet = [NSCharacterSet characterSetWithCharactersInString:@" -\n_!@#$%^&*()[]{}'\".,<>:;|\\/?+=\t~` "];
    
    NSString  * result  = @"";
    NSScanner * scanner = [NSScanner scannerWithString:string];
    NSString  * scannerResult;
    
    [scanner setCharactersToBeSkipped:nil];
    
    while (![scanner isAtEnd])
    {
        if([scanner scanUpToCharactersFromSet:invalidNumberSet intoString:&scannerResult])
        {
            result = [result stringByAppendingString:scannerResult];
        }
        else
        {
            if(![scanner isAtEnd])
            {
                [scanner setScanLocation:[scanner scanLocation]+1];
            }
        }
    }
    
    return result;
}

+ (NSString *)flattenHTML:(NSString *)html {
    if([self isEmpty:html]){
        return html;
    }
    
    NSScanner *theScanner;
    NSString *text = nil;
    
    theScanner = [NSScanner scannerWithString:html];
    
    while (! [theScanner isAtEnd]) {
        
        // find start of tag
        [theScanner scanUpToString:@"<" intoString:NULL] ;
        // find end of tag
        [theScanner scanUpToString:@">" intoString:&text] ;
        
        // replace the found tag with a space
        //(you can filter multi-spaces out later if you wish)
        html = [html stringByReplacingOccurrencesOfString:
                [ NSString stringWithFormat:@"%@>", text]
                                               withString:@""];
    }
    
    return [html stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

+ (NSString *)getPureText:(NSString *)input {
    if([self isEmpty:input]){
        return input;
    }
    input = [input stringByReplacingOccurrencesOfString:@" " withString:@""];
    input = [input stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    input = [input stringByReplacingOccurrencesOfString:@"\t" withString:@""];
    input = [input stringByReplacingOccurrencesOfString:@"\b" withString:@""];
    input = [input stringByReplacingOccurrencesOfString:@"\r" withString:@""];
    input = [input stringByReplacingOccurrencesOfString:@"\f" withString:@""];
    return input;
}


+ (NSString *)getShortText:(NSString *)text maxLen:(int)maxLen{
    if([KWMStringUtil isEmpty:text]){
        return text;
    }
    if(text.length > maxLen){
        NSString *moreStr = @"…";
        text = [text substringWithRange:NSMakeRange(0, (NSUInteger) (maxLen - moreStr.length))];
        text = [text stringByAppendingString:moreStr];
    }
    
    return text;
}

+ (NSString *)urlencode:(NSString *)input {
    NSMutableString *output = [NSMutableString string];
    const unsigned char *source = (const unsigned char *)[input UTF8String];
    NSInteger sourceLen = strlen((const char *)source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = source[i];
        if (thisChar == ' '){
            [output appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
                   (thisChar >= 'a' && thisChar <= 'z') ||
                   (thisChar >= 'A' && thisChar <= 'Z') ||
                   (thisChar >= '0' && thisChar <= '9')) {
            [output appendFormat:@"%c", thisChar];
        } else {
            [output appendFormat:@"%%%02X", thisChar];
        }
    }
    return output;
}

+ (NSString *)fitImageWidthHtmlContent:(NSString *)htmlContent maxWidth:(NSInteger)width{
    
    NSString *preHtml = [[NSString alloc] initWithFormat:@"<!DOCTYPE HTML><html><head><script type=\"text/javascript\">function ResizeImages(myimg){var maxWidth = %d; var oldWidth; var oldwidth,oldHeight;var i;myimg.style.cssText=\"\"; if(myimg.width > maxWidth){oldWidth = myimg.width; oldHeight = myimg.height; myimg.width = maxWidth; myimg.height = oldHeight*(maxWidth/oldWidth);}}</script><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\"><style>* {font-family: Arial,Helvetica,\"Nimbus Sans L\",sans-serif;-webkit-text-size-adjust: none;}div.container img{padding-bottom:10px;}</style></head><body style=\"-moz-user-select: none;-webkit-user-select: none;width:%dpx;px;margin-left:10px;padding: 0px;margin-right:10px\">",
                         width, width];
    NSString *afterHtml = @"</body></html>";
    htmlContent = [htmlContent stringByReplacingOccurrencesOfString:@"<img" withString:@"<img onload=\"ResizeImages(this);\""];
    htmlContent = [NSString stringWithFormat:@"%@%@%@", preHtml, htmlContent, afterHtml];
    return htmlContent;
}

+ (BOOL)isMobileNumber:(NSString *)mobileNum
{
    static NSString *TRUE_PHONE = @"^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$";
    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", TRUE_PHONE];
    
    return [regextestmobile evaluateWithObject:mobileNum];
}

+ (NSString * _Nonnull)nonNullString:(NSString * _Nullable)input {
    if (input != nil) {
        if ([input isKindOfClass:[NSString class]]) {
            return input;
        }
    }
    return @"";
}

//去掉string的左右的空格
+(NSString *)deleteBlankForString:(NSString *)text{
    NSString *textString = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    return textString;
}

// 计算内容的高度
+(CGSize)boundingRectWithSize:(CGSize)size text:(NSString *)text testSize:(CGFloat) testSize{
    
    UIFont *font = [UIFont systemFontOfSize:testSize];
    NSDictionary *attribute = @{NSFontAttributeName:font};
    
    CGSize retSize = [text boundingRectWithSize:CGSizeMake(size.width , MAXFLOAT)
                                        options:
                      NSStringDrawingTruncatesLastVisibleLine |
                      NSStringDrawingUsesLineFragmentOrigin |
                      NSStringDrawingUsesFontLeading
                                     attributes:attribute
                                        context:nil].size;
    
    return retSize;
}

//计算内容的宽度
+(CGSize)getLabelWidth:(NSString *)text labelFont:(UIFont *)aLabelFont textHeight:(CGFloat) textHeight{
    
    CGSize constraint = CGSizeMake(MAXFLOAT, textHeight);
    CGRect rect = [text boundingRectWithSize:constraint
                                     options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                  attributes:@{
                                               NSFontAttributeName : aLabelFont
                                               }
                                     context:nil];
    return rect.size;
}

//计算文本内容的高度
+(CGSize)getLabelHeight:(NSString *)text labelFont:(UIFont *)aLabelFont textWidth:(CGFloat) textWidth{
    
    CGSize constraint = CGSizeMake(textWidth, MAXFLOAT);
    
    CGRect rect = [text boundingRectWithSize:constraint
                                     options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                  attributes:@{
                                               NSFontAttributeName : aLabelFont
                                               }
                                     context:nil];
    return rect.size;
}

//删除出字母以及“-”以外的字符补充为@"-"
static NSString *kEnglishNum = @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-";
+ (NSString *)deleteOtherCharExceptLetterWithLine:(NSString *)str{
    
    NSString *changeStr = [str stringByReplacingOccurrencesOfString:@"é" withString:@"e"];
    changeStr = [changeStr stringByReplacingOccurrencesOfString:@"è" withString:@"e"];
    changeStr = [changeStr stringByReplacingOccurrencesOfString:@"'" withString:@""];

    NSMutableString *newStr = [NSMutableString stringWithFormat:@"%@",[self changeString:changeStr]];
    NSMutableString *tempStr = newStr;
    BOOL isHas = NO;
    for (int i = 0; i < newStr.length; ++i) {
        unichar aChar = [newStr characterAtIndex:i];
        NSString *aStr = [NSString stringWithFormat:@"%c",aChar];
        if ([aStr isEqualToString:@"-"]) {
            if (isHas) {
                [tempStr deleteCharactersInRange:NSMakeRange(i, 1)];
            }else{
                isHas = YES; 
            }
        }else{
            isHas = NO;
        }
    }
    return newStr;
}

+ (NSString *)changeString:(NSString *)str{
    NSString *newStr = [NSString stringWithFormat:@"%@", str];
    NSInteger markP = -1;
    for (int i = 0; i < str.length; ++i) {
        unichar aChar = [str characterAtIndex:i];
        NSString *aStr = [NSString stringWithFormat:@"%c",aChar];
        if (![kEnglishNum containsString:aStr]) {
            if (markP == -1) {
                newStr = [newStr stringByReplacingOccurrencesOfString:aStr withString:@"-"];
                markP = i;
            }else{
                newStr = [newStr stringByReplacingOccurrencesOfString:aStr withString:@""];
            }
            
        }
    }
    return newStr;
}

+(NSNumber *)stringToNumber:(NSString *)numberString{
    if([self isEmpty:numberString]){
        return [NSNumber numberWithInteger:0];
    }
    id result;
    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    if ([f numberFromString:numberString])
    {
        result=[NSNumber numberWithFloat:[numberString floatValue]];
    }
    else
    {
        return [NSNumber numberWithInteger:0];
    }
    return result;

}


//中文转拼音
+ (NSString *)transform:(NSString *)chinese{
    NSMutableString *pinyin = [NSMutableString stringWithString:chinese];

    CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);//带音标
    
    CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripDiacritics, NO);//去掉音标
//    return [pinyin uppercaseString];
    return pinyin;
}

//¥
+ (NSString *)getEUR2CNYstring:(NSNumber *)price{
    NSString *CNYstring = @" ";
    if(price == nil){
        return CNYstring;
    }
    float exchageRate = [[KWMUserDao shareDao] exchangeRate].floatValue;
//    if(exchageRate == 0){
//        exchageRate = ExchangeRate;
//    }
    CNYstring = [NSString stringWithFormat:@"%.2f",price.floatValue * exchageRate];
//    CNYstring = [NSString stringWithFormat:@"%.2f",price.floatValue];

    return CNYstring;
}

+ (NSString *)price:(NSNumber *)price{
    NSString *CNYstring = [self getEUR2CNYstring:price];
    return [NSString stringWithFormat:@"CN¥%@",CNYstring];
}

+ (NSArray *)splitArray:(NSArray *)array withSubSize:(NSInteger)subSize{
    //拆分后的数组个数
    NSInteger count = array.count % subSize == 0?(array.count /subSize): (array.count / subSize + 1);
    NSMutableArray *arr = [NSMutableArray array];
    for (int i = 0; i < count; i ++) {
        //数组下标
        NSInteger index = i * subSize;
        //保存拆分的固定长度的数组元素的可变数组
        NSMutableArray *arr1 = [[NSMutableArray alloc] init];
        //移除子数组的所有元素
        [arr1 removeAllObjects];
        
        NSInteger j = index;
        //将数组下标乘以1、2、3,得到拆分时数组的最大下标值,但最大不能超过数组的总大小
        while (j < subSize*(i + 1) && j < array.count) {
            [arr1 addObject:[array objectAtIndex:j]];
            j += 1;
        }
        //将子数组添加到保存子数组的数组中
        [arr addObject:[arr1 copy]];
    }
    return [arr copy];
}

@end