//
//  STPPostalCodeValidator.m
//  Stripe
//
//  Created by Ben Guo on 4/14/16.
//  Copyright © 2016 Stripe, Inc. All rights reserved.
//

#import "STPPostalCodeValidator.h"
#import "STPCardValidator.h"
#import "STPPhoneNumberValidator.h"

@implementation STPPostalCodeValidator

+ (BOOL)stringIsValidPostalCode:(nullable NSString *)string
                           type:(STPPostalCodeType)postalCodeType {
    switch (postalCodeType) {
        case STPCountryPostalCodeTypeNumericOnly: {
            NSInteger length = [STPCardValidator sanitizedNumericStringForString:string].length;
            return (length == 5 || length == 9);
        }
        case STPCountryPostalCodeTypeAlphanumeric:
            return string.length > 0;
        case STPCountryPostalCodeTypeNotRequired:
            return YES;
    }
}

+ (BOOL)stringIsValidPostalCode:(nullable NSString *)string
                    countryCode:(nullable NSString *)countryCode {
    return [self stringIsValidPostalCode:string
                                    type:[self postalCodeTypeForCountryCode:countryCode]];
}

+ (STPPostalCodeType)postalCodeTypeForCountryCode:(NSString *)countryCode {
    if ([countryCode isEqualToString:@"US"]) {
        return STPCountryPostalCodeTypeNumericOnly;
    }
    else if ([[self countriesWithNoPostalCodes] containsObject:countryCode]) {
        return STPCountryPostalCodeTypeNotRequired;
    }
    else {
        return STPCountryPostalCodeTypeAlphanumeric;
    }
}

+ (NSArray *)countriesWithNoPostalCodes {
    return @[ @"AE",
              @"AG",
              @"AN",
              @"AO",
              @"AW",
              @"BF",
              @"BI",
              @"BJ",
              @"BO",
              @"BS",
              @"BW",
              @"BZ",
              @"CD",
              @"CF",
              @"CG",
              @"CI",
              @"CK",
              @"CM",
              @"DJ",
              @"DM",
              @"ER",
              @"FJ",
              @"GD",
              @"GH",
              @"GM",
              @"GN",
              @"GQ",
              @"GY",
              @"HK",
              @"IE",
              @"JM",
              @"KE",
              @"KI",
              @"KM",
              @"KN",
              @"KP",
              @"LC",
              @"ML",
              @"MO",
              @"MR",
              @"MS",
              @"MU",
              @"MW",
              @"NR",
              @"NU",
              @"PA",
              @"QA",
              @"RW",
              @"SA",
              @"SB",
              @"SC",
              @"SL",
              @"SO",
              @"SR",
              @"ST",
              @"SY",
              @"TF",
              @"TK",
              @"TL",
              @"TO",
              @"TT",
              @"TV",
              @"TZ",
              @"UG",
              @"VU",
              @"YE",
              @"ZA",
              @"ZW"
              ];
}

@end
