//
//  TDAnalytics+Public.m
//  ThinkingSDK
//
//  Created by 杨雄 on 2023/8/17.
//

#import "TDAnalytics+Public.h"
#import "TDAnalytics+Multiple.h"
#import "ThinkingAnalyticsSDKPrivate.h"
#import "TDLogging.h"
#import "TDPublicConfig.h"
#import "TDConfigPrivate.h"

#if __has_include(<ThinkingDataCore/TDCalibratedTime.h>)
#import <ThinkingDataCore/TDCalibratedTime.h>
#else
#import "TDCalibratedTime.h"
#endif

#if __has_include(<ThinkingDataCore/TDCoreDeviceInfo.h>)
#import <ThinkingDataCore/TDCoreDeviceInfo.h>
#else
#import "TDCoreDeviceInfo.h"
#endif

#if __has_include(<ThinkingDataCore/NSString+TDCore.h>)
#import <ThinkingDataCore/NSString+TDCore.h>
#else
#import "NSString+TDCore.h"
#endif

#if __has_include(<ThinkingDataCore/NSURL+TDCore.h>)
#import <ThinkingDataCore/NSURL+TDCore.h>
#else
#import "NSURL+TDCore.h"
#endif

#if TARGET_OS_IOS
#if __has_include(<ThinkingDataCore/TDStorageEncryptPlugin.h>)
#import <ThinkingDataCore/TDStorageEncryptPlugin.h>
#else
#import "TDStorageEncryptPlugin.h"
#endif
#endif

@implementation TDAnalytics (Public)

#pragma mark - Logging

+ (void)enableLog:(BOOL)enable {
    [TDLogging sharedInstance].enableLog = enable;
}

#pragma mark - Calibrate time

+ (void)calibrateTime:(NSTimeInterval)timestamp {
    [[TDCalibratedTime sharedInstance] recalibrationWithTimeInterval:timestamp/1000.0];
}

+ (void)calibrateTimeWithNtp:(NSString *)ntpServer {
    if ([ntpServer isKindOfClass:[NSString class]] && ntpServer.length > 0) {
        [[TDCalibratedTime sharedInstance] recalibrationWithNtps:@[ntpServer]];
    }
}

// MARK: info

+ (nullable NSString *)getLocalRegion {
    NSString *countryCode = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
    return countryCode;
}

+ (void)setCustomerLibInfoWithLibName:(NSString *)libName libVersion:(NSString *)libVersion {
    if (libName.length > 0) {
        [TDDeviceInfo sharedManager].libName = libName;
    }
    if (libVersion.length > 0) {
        [TDDeviceInfo sharedManager].libVersion = libVersion;
    }
}

+ (NSString *)getSDKVersion {
    return TDPublicConfig.version;
}

+ (NSString *)getDeviceId {
    return [TDCoreDeviceInfo deviceId];
}

+ (NSString *)timeStringWithDate:(NSDate *)date {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    return [TDAnalytics timeStringWithDate:date withAppId:appId];
}

//MARK: - init

+ (void)startAnalyticsWithAppId:(NSString *)appId serverUrl:(NSString *)url {
    TDConfig *config = [[TDConfig alloc] init];
    config.appid = appId;
    config.serverUrl = url;
    [self startAnalyticsWithConfig:config];
}

+ (void)startAnalyticsWithConfig:(TDConfig *)config {
    if (!config) {
        return;
    }
    NSString *appId = [config.appid td_trim];
    if (appId.length == 0) {
        return;
    }
    config.appid = appId;
    
    NSMutableDictionary *instances = [ThinkingAnalyticsSDK _getAllInstances];
    if ([instances objectForKey:[config innerGetMapInstanceToken]]) {
        return;
    }
    
    NSString *url = [NSURL td_baseUrlStringWithString:config.serverUrl];
    if (url.length == 0) {
        return;
    }
    config.serverUrl = url;

    ThinkingAnalyticsSDK *sdk = [[ThinkingAnalyticsSDK alloc] initWithConfig:config];
    TDLogInfo(@"instance token: %@", [sdk.config innerGetMapInstanceToken]);
}

+ (NSString *)lightInstanceIdWithAppId:(NSString *)appId {
    ThinkingAnalyticsSDK *instance = [ThinkingAnalyticsSDK instanceWithAppid:appId];
    if (instance) {
        ThinkingAnalyticsSDK *lightInstance = [instance innerCreateLightInstance];
        return [lightInstance.config innerGetMapInstanceToken];
    }
    return nil;
}

//MARK: track

+ (void)flush {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics flushWithAppId:appId];
}

+ (void)setTrackStatus:(TDTrackStatus)status {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics setTrackStatus:status withAppId:appId];
}

+ (void)track:(NSString *)eventName {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics track:eventName withAppId:appId];
}

+ (void)track:(NSString *)eventName properties:(nullable NSDictionary *)properties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics track:eventName properties:properties withAppId:appId];
}

+ (void)track:(NSString *)eventName properties:(nullable NSDictionary *)properties time:(NSDate *)time timeZone:(NSTimeZone *)timeZone {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics track:eventName properties:properties time:time timeZone:timeZone withAppId:appId];
}

+ (void)trackWithEventModel:(TDEventModel *)eventModel {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics trackWithEventModel:eventModel withAppId:appId];
}

+ (void)timeEvent:(NSString *)eventName {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics timeEvent:eventName withAppId:appId];
}

//MARK: user property

+ (void)userSet:(NSDictionary<NSString *, id> *)properties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userSet:properties withAppId:appId];
}

+ (void)userSetOnce:(NSDictionary<NSString *, id> *)properties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userSetOnce:properties withAppId:appId];
}

+ (void)userUnset:(NSString *)propertyName {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userUnset:propertyName withAppId:appId];
}

+ (void)userUnsets:(NSArray<NSString *> *)propertyNames {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userUnsets:propertyNames withAppId:appId];
}

+ (void)userAdd:(NSDictionary<NSString *, id> *)properties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userAdd:properties withAppId:appId];
}

+ (void)userAddWithName:(NSString *)propertyName andValue:(NSNumber *)propertyValue {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userAddWithName:propertyName andValue:propertyValue withAppId:appId];
}

+ (void)userAppend:(NSDictionary<NSString *, NSArray *> *)properties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userAppend:properties withAppId:appId];
}

+ (void)userUniqAppend:(NSDictionary<NSString *, NSArray *> *)properties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userUniqAppend:properties withAppId:appId];
}

+ (void)userDelete {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics userDeleteWithAppId:appId];
}

//MARK: super property & preset property

+ (void)setSuperProperties:(NSDictionary<NSString *, id> *)properties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics setSuperProperties:properties withAppId:appId];
}

+ (void)unsetSuperProperty:(NSString *)property {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics unsetSuperProperty:property withAppId:appId];
}

+ (void)clearSuperProperties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics clearSuperPropertiesWithAppId:appId];
}

+ (NSDictionary *)getSuperProperties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    return [TDAnalytics getSuperPropertiesWithAppId:appId];
}

+ (void)setDynamicSuperProperties:(NSDictionary<NSString *, id> *(^)(void))propertiesHandler {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics setDynamicSuperProperties:propertiesHandler withAppId:appId];
}

+ (TDPresetProperties *)getPresetProperties {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    return [TDAnalytics getPresetPropertiesWithAppId:appId];
}

//MARK: error callback

+ (void)registerErrorCallback:(void(^)(NSInteger code, NSString * _Nullable errorMsg, NSString * _Nullable ext))errorCallback {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics registerErrorCallback:errorCallback withAppId:appId];
}

//MARK: custom property

+ (void)setDistinctId:(NSString *)distinctId {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics setDistinctId:distinctId withAppId:appId];
}

+ (NSString *)getDistinctId {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    return [TDAnalytics getDistinctIdWithAppId:appId];
}

+ (void)login:(NSString *)accountId {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics login:accountId withAppId:appId];
}

+ (NSString *)getAccountId {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    return [TDAnalytics getAccountIdWithAppId:appId];
}

+ (void)logout {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics logoutWithAppId:appId];
}

+ (void)setUploadingNetworkType:(TDReportingNetworkType)type {
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics setUploadingNetworkType:type withAppId:appId];
}

#if TARGET_OS_IOS

// MARK: - Local storage encrypt

+ (void)encryptLocalStorage {
    [[TDStorageEncryptPlugin sharedInstance] enableEncrypt];
}

// MARK: - auto track

+ (void)enableAutoTrack:(TDAutoTrackEventType)eventType API_UNAVAILABLE(macos){
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics enableAutoTrack:eventType withAppId:appId];
}

+ (void)enableAutoTrack:(TDAutoTrackEventType)eventType properties:(NSDictionary * _Nullable)properties API_UNAVAILABLE(macos){
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics enableAutoTrack:eventType properties:properties withAppId:appId];
}

+ (void)enableAutoTrack:(TDAutoTrackEventType)eventType callback:(NSDictionary *(^ _Nullable)(TDAutoTrackEventType, NSDictionary *))callback API_UNAVAILABLE(macos){
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics enableAutoTrack:eventType callback:callback withAppId:appId];
}

+ (void)ignoreAutoTrackViewControllers:(nonnull NSArray<NSString *> *)controllers API_UNAVAILABLE(macos){
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics ignoreAutoTrackViewControllers:controllers withAppId:appId];
}

+ (void)ignoreViewType:(nonnull Class)aClass API_UNAVAILABLE(macos){
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics ignoreViewType:aClass withAppId:appId];
}

+ (void)setAutoTrackProperties:(TDAutoTrackEventType)eventType properties:(NSDictionary * _Nullable)properties API_UNAVAILABLE(macos){
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics setAutoTrackProperties:eventType properties:properties withAppId:appId];
}

+ (void)setAutoTrackDynamicProperties:(NSDictionary<NSString *,id> * _Nonnull (^)(void))dynamicSuperProperties API_UNAVAILABLE(macos){
    NSString *appId = [ThinkingAnalyticsSDK defaultAppId];
    [TDAnalytics setAutoTrackDynamicProperties:dynamicSuperProperties withAppId:appId];
}

#endif

@end
