//
//  CfLogCore.swift
//  ReactNativeCfCore
//
//  Created by MOIZ HASSAN KHAN on 12/12/23.
//  Copyright © 2023 Facebook. All rights reserved.
//

import Foundation
import CausalFoundrySDKCore

@objc(CfLogCore)
class CfLogCore: RCTEventEmitter  {
    
    override static func moduleName() -> String {
        return "CfLogCore"
    }
    
    override func supportedEvents() -> [String]! {
        return ["NudgeOnClickEvent"]
    }
    
   @objc
    func initCFSDK(_ sdkKey : String){
       CausalFoundry.shared.configure()

       CFLogBuilder()
           .setAppLevelContentBlock(contentBlock: .Core)
           .updateImmediately(updateImmediately: false)
           .allowAnonymousUsers()
           .setSdkKey(sdkKey: sdkKey)
           .disableAutoPageTrack()
           .setUsageForReactNative()
           .build()

       print("CF SDK init")

   }


   @objc
    func logIngestEvent(_ eventType: String, eventProps: String, updateImmediately: Bool) {
        
        switch eventType {
            case "identify":
                CFCoreEvent.shared.logIngest(eventType: .Identify, logObject: IdentifyEventValidator.mapStringToInternalIdentifyObject(objectString: eventProps),
                                             isUpdateImmediately: updateImmediately)
            case "page":
                CFCoreEvent.shared.logIngest(eventType: .Page, logObject:
                                        PageEventValidator.mapStringToPageObject(objectString: eventProps),
                                        contentBlock: ContentBlock.Core,
                                         isUpdateImmediately: updateImmediately)
            case "media":
                CFCoreEvent.shared.logIngest(eventType: .Media, logObject:
                                             MediaEventValidator.mapStringToMediaObject(objectString: eventProps),
                                             contentBlock: ContentBlock.Core,
                                             isUpdateImmediately: updateImmediately)
            case "search":
                CFCoreEvent.shared.logIngest(eventType: .Search, logObject:            SearchEventValidator.mapStringToSearchObject(objectString: eventProps),
                                              contentBlock: ContentBlock.Core,
                                              isUpdateImmediately: updateImmediately)
            case "rate":
                CFCoreEvent.shared.logIngest(eventType: .Rate, logObject:
                                             RateEventValidator.mapStringToRateObject(objectString: eventProps),
                                             contentBlock: ContentBlock.Core,
                                             isUpdateImmediately: updateImmediately)
            default:
                print("Invalid event type")
        }
   }
    
    
   @objc
    func logCatalogEvent(_ catalogType: String, catalogObject: String) {
        
        switch catalogType {
            case "user":
                CFCoreEvent.shared.logCatalog(coreCatalogType: CoreCatalogSubject.User, catalogModel: catalogObject)
            case "media":
                CFCoreEvent.shared.logCatalog(coreCatalogType: CoreCatalogSubject.Media, catalogModel: catalogObject)
            case "site":
                CFCoreEvent.shared.logCatalog(coreCatalogType: CoreCatalogSubject.Site, catalogModel: catalogObject)
            default:
                print("Invalid event type")
        }
   }
    
    @objc func getNudgeResponse() {
        NudgeOnClickObject.nudgeOnClickInterface = { cta, itemType, itemID in
            // Define your logic here
            let nudgeItems = "\(cta)||\(itemType)||\(itemID)"
            print(nudgeItems)
            self.sendEvent(withName: "NudgeOnClickEvent", body: ["nudgeItems": nudgeItems])
        }
    }
    
    @objc func showInAppMessage(_ nudgeScreenType : String) {
        CFInAppMessage.show(nudgeScreenType: nudgeScreenType)
    }
    
    @objc func uploadAllEvents() {
        Task {
            do {
                try await WorkerCaller.performUpload()
            } catch {
                print("failed to upload all events")
            }
        }
    }
    

    @objc
    override static func requiresMainQueueSetup() -> Bool {
        return true
      }

//  @objc(multiply:withB:withResolver:withRejecter:)
//  func multiply(a: Float, b: Float, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
//    resolve(a*b)
//  }
}







