#import <Foundation/Foundation.h>

#import <SGSBase/SGSBase.h>

#import "BaseNativeInterface.h"

// MARK: - Extern APIs

void stove_base_initialize(const char *environment, const char *identifier)
{
    NSString *nsEnvironment = StoveSDKMakeNSString(environment);
    NSString *nsIdentifier = StoveSDKMakeNSString(identifier);
    
    [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"com.stove.sdk:SGS_BASE_CONSTANTS"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    [SGSConstants requestConstantsWithEnvironment:nsEnvironment completionHandler:^(SGSResult * _Nonnull result) {
        NSDictionary *resultDic = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [result dictionary], @"result",
                                   nil];
        
        StoveSDKNativeCallbackPayload *payload =
        [StoveSDKNativeCallbackPayload payloadWithIdentifier:nsIdentifier value:resultDic];
        [payload sendMessage];
    }];
}

int stove_base_getLanguage()
{
    return (int)[SGSLocalization language];
}

void stove_base_setLanguage(int language)
{
    [SGSLocalization setLanguage:(SGSLanguage)language];
}

const char *stove_base_get(const char *key)
{
    NSString *nsKey = StoveSDKMakeNSString(key);
    id value = [SGSConstants objectForKey:nsKey];
    
    if (value == nil) {
        return StoveSDKMakeCString(@"");
    }
    
    NSString *convertedValue;
    if ([value isKindOfClass:[NSDictionary class]] || [value isKindOfClass:[NSArray class]]) {
        convertedValue = [value JSONString];
    } else if ([value isKindOfClass:[NSNumber class]]) {
        convertedValue = [value stringValue];
    } else {
        convertedValue = [NSString stringWithFormat:@"%@", value];
    }
    
    return StoveSDKMakeCString(convertedValue);
}

bool stove_base_get_bool(const char *key, bool defaultValue)
{
    NSString *nsKey = StoveSDKMakeNSString(key);
    NSNumber *value = [SGSConstants objectForKey:nsKey];

    if (value == nil) {
        return defaultValue;
    }

    return [value boolValue];
}

const char *stove_base_version() {
    NSString * version = [SGSBase moduleVersion];
    return StoveSDKMakeCString(version);
}

void stove_base_setBuildConfiguration(const char *buildConfiguration)
{
    NSString *nsbuildConfigurationString = StoveSDKMakeNSString(buildConfiguration);
    if (!isNilOrEmpty(nsbuildConfigurationString)) {
        SGSBuildConfiguration *buildConfiguration = [SGSBuildConfiguration buildConfigurationWithDictionary:[nsbuildConfigurationString JSONObject]];
        [SGSConstants setBuildConfiguration:buildConfiguration];
    }
}
