//
//  RookConfiguration.swift
//  Plugin
//
//  Created by Francisco Guerrero Escamilla on 29/04/24.
//  Copyright © 2024 Max Lynch. All rights reserved.
//

import Foundation
import Capacitor
import RookSDK
import HealthKit

@objc public class RookConfiguration: NSObject {

  @objc public func initRook(environment: String,
                             clientUUID: String,
                             secret: String,
                             bundleId: String?,
                             enableBackgroundSync: Bool,
                             enableEventsBackgroundSync: Bool,
                             enableLogs: Bool) -> Bool {
    RookConnectConfigurationManager.shared.setConfiguration(
      clientUUID: clientUUID,
      secret: secret,
      bundleId: bundleId,
      enableBackgroundSync: enableBackgroundSync,
      enableEventsBackgroundSync: enableEventsBackgroundSync)
    AnalyticsExtractionConfigurator.shared.setPlatform(.capacitor)
    AnalyticsTransmissionConfigurator.shared.setPlatform(.capacitor)
    switch environment {
    case "production":
      RookConnectConfigurationManager.shared.setEnvironment(.production)
      IOSClass.shared.disableTest()
    default:
      RookConnectConfigurationManager.shared.setEnvironment(.sandbox)
      IOSClass.shared.disableTest()
    }
    RookConnectConfigurationManager.shared.setConsoleLogAvailable(enableLogs)
    RookConnectConfigurationManager.shared.initRook(completion: { _ in })
    return true
  }

  @objc public func checkAvailability() -> String {
    if HKHealthStore.isHealthDataAvailable() {
      return "INSTALLED"
    } else {
      return "NOT_INSTALLED"
    }
  }

  @objc public func updateUserId(userId: String, call: CAPPluginCall) {
    RookConnectConfigurationManager.shared.updateUserId(userId) { result in
      switch result {
      case .success(let result):
        call.resolve(["result": result])
      case .failure(let error):
        call.reject(error.localizedDescription)
      }
    }
  }

  @objc public func getUserId(call: CAPPluginCall) {
    RookConnectConfigurationManager.shared.getUserId { result in
      switch result {
      case .success(let id):
        call.resolve(["userId" : id])
      case .failure(let error):
        call.reject(error.localizedDescription)
      }
    }
  }

  @objc public func clearUserId(call: CAPPluginCall) {
    RookConnectConfigurationManager.shared.removeUserFromRook() { result in
      switch result {
      case .success(let result):
        call.resolve(["result": result])
      case .failure(let error):
        call.reject(error.localizedDescription)
      }
    }
  }

  @objc public func deleteUserFromRook(call: CAPPluginCall) {
    RookConnectConfigurationManager.shared.removeUserFromRook { result in
      switch result {
      case .success(let result):
        call.resolve(["result": result])
      case .failure(let error):
        call.reject(error.localizedDescription)
      }
    }
  }

  @objc public func enableAppleHealthSync(call: CAPPluginCall) {
    RookConnectConfigurationManager.shared.enableSync()
    call.resolve(["result": true])
  }

  @objc public func disableAppleHealthSync(call: CAPPluginCall) {
    RookConnectConfigurationManager.shared.disableSync()
    call.resolve(["result": true])
  }

  @objc public func isAppleHealthSyncEnable() -> Bool {
    return RookConnectConfigurationManager.shared.isSyncEnable()
  }

  @objc public func syncUserTimeZone(call: CAPPluginCall) {
    RookConnectConfigurationManager.shared.syncUserTimeZone { result in
      switch result {
      case .success(let result):
        call.resolve(["result": result])
      case .failure(let error):
        call.reject(error.localizedDescription)
      }
    }
  }

  @objc public func getDiagnostic(call: CAPPluginCall) {
    RookConnectConfigurationManager.shared.getDiagnosticState() { state in
      let mapper: SDKDiagnosticMapper = SDKDiagnosticMapper()
      call.resolve(["result": mapper.map(state)])
    }
  }
}
