import Foundation

@objc(CheckoutModuleHandler)
public class CheckoutModuleHandler: NSObject {
  
  @objc(sharedInstance)
  public static let shared = CheckoutModuleHandler()
  
  private override init() {}
  
  @objc public func initialize(args: [String: Any], completion: @escaping (Error?) -> Void) {
    
    guard let publicKey = args[ModuleConfigKeys.publicKey] as? String else {
      completion(CheckoutError.missingPublicKey.nsError)
      return
    }

    guard let environment = args[ModuleConfigKeys.environment] as? String else {
      completion(CheckoutError.missingEnvironment.nsError)
      return
    }
    
    guard let paymentSession = args[ModuleConfigKeys.paymentSession] as? [String: Any],
          let id = paymentSession[ModuleConfigKeys.paymentSessionId] as? String,
          let paymentSessionSecret = paymentSession[ModuleConfigKeys.paymentSessionSecret] as? String else {
      completion(CheckoutError.missingPaymentSession.nsError)
      return
    }
    
    CheckoutManager.shared.setEnvironment(value: environment)
    CheckoutManager.shared.setPublicKey(value: publicKey)
    CheckoutManager.shared.setPaymentSession(
      paymentSessionId: id,
      paymentSessionSecret: paymentSessionSecret
    )
    
    if let locale = args[ModuleConfigKeys.locale] as? String {
      CheckoutManager.shared.setLocale(locale: locale)
    }
    
    if let translations = args[ModuleConfigKeys.translations] as? [String: Any] {
      CheckoutManager.shared.setTranslations(translations: translations)
    }

    if let style = args[ModuleConfigKeys.style] as? [String: Any] {
      CheckoutManager.shared.setAppearance(style: style)
    }
        
    if let merchantIdentifier = args[ModuleConfigKeys.merchantIdentifier] as? String {
      CheckoutManager.shared.setMerchantIdentifier(value: merchantIdentifier)
    }
    
    let callbackStrings = args[ModuleConfigKeys.registeredCallbacks] as? [String] ?? []
    let registeredCallbacks = callbackStrings.compactMap { Event(rawValue: $0) }
    
    CheckoutManager.shared.initializeSDK(callbacks: registeredCallbacks, completion: completion)
  }
  
  @objc public func clear() -> Bool {
    CheckoutManager.shared.clear()
    return true
  }
  
  @objc public func resolveSubmit(
    callbackId: String,
    args: [String: Any],
    completion: @escaping (Error?) -> Void
  ) {
    CheckoutManager.shared.resolveSubmitCallback(
      callbackId: callbackId,
      args: args,
      completion: completion
    )
  }
  
  @objc public func resolveTokenized(
    callbackId: String,
    success: Bool,
    error: String?,
    completion: @escaping (Error?) -> Void
  ) {
    CheckoutManager.shared.resolveTokenizedCallback(
      callbackId: callbackId,
      success: success,
      error: error,
      completion: completion
    )
  }
}
