//
//  PayVM.m
//

#import "PayVM.h"
#import "KBNetworkManager.h"
#import "KBAPI.h"
#import "KBHUD.h"

@implementation PayVM

- (void)applePayReqWithParams:(NSDictionary *)params
                     needShow:(BOOL)needShow
                   completion:(KBPayCompletion)completion {
    if (needShow) { [KBHUD show]; }

    [[KBNetworkManager shared] POST:KB_API_IAP_VERIFY jsonBody:params headers:nil completion:^(id  _Nullable jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (needShow) { [KBHUD dismiss]; }

        if (error) {
            if (completion) completion(KB_PAY_ERROR_CODE, error.localizedDescription ?: @"网络错误");
            return;
        }

        NSInteger sta = [self.class extractStatusFromResponseObject:jsonOrData response:response];
        NSString *msg = [self.class extractMessageFromResponseObject:jsonOrData] ?: (sta == KB_PAY_SUCC_CODE ? @"OK" : @"失败");
        if (completion) completion(sta, msg);
    }];
}

#pragma mark - Helpers

+ (NSInteger)extractStatusFromResponseObject:(id)obj response:(NSURLResponse *)resp {
    // 优先从 JSON 提取 code/status/success
    if ([obj isKindOfClass:NSDictionary.class]) {
        NSDictionary *d = (NSDictionary *)obj;
        id code = d[@"code"] ?: d[@"status"] ?: d[@"retcode"];
        if ([code isKindOfClass:NSNumber.class]) {
            return [((NSNumber *)code) integerValue] == 0 ? KB_PAY_SUCC_CODE : KB_PAY_ERROR_CODE;
        }
        if ([code isKindOfClass:NSString.class]) {
            // 常见："0" 视为成功
            return [((NSString *)code) integerValue] == 0 ? KB_PAY_SUCC_CODE : KB_PAY_ERROR_CODE;
        }
        id success = d[@"success"] ?: d[@"ok"];
        if ([success respondsToSelector:@selector(boolValue)]) {
            return [success boolValue] ? KB_PAY_SUCC_CODE : KB_PAY_ERROR_CODE;
        }
    }
    // 无明显字段，按 HTTP 2xx 视为成功
    NSInteger http = 0;
    if ([resp isKindOfClass:NSHTTPURLResponse.class]) { http = ((NSHTTPURLResponse *)resp).statusCode; }
    return (http >= 200 && http < 300) ? KB_PAY_SUCC_CODE : KB_PAY_ERROR_CODE;
}

+ (NSString *)extractMessageFromResponseObject:(id)obj {
    if (![obj isKindOfClass:NSDictionary.class]) return nil;
    NSDictionary *d = (NSDictionary *)obj;
    NSString *msg = d[@"message"] ?: d[@"msg"] ?: d[@"error"];
    if (![msg isKindOfClass:NSString.class]) msg = nil;
    return msg;
}

@end

