//
//  SentianceDrivingInsights.swift
//  SentianceDrivingInsights
//
//  Created by Mohammed Aouf Zouag on 17/09/2025.
//

import Foundation
import SENTSDK

@objc(SentianceDrivingInsights)
class SentianceDrivingInsights: NSObject {
  
  private let sdkNotInitializedError = (code: ESDKNotInitialized, message: "SDK is not initialized")
  private let sentiance = Sentiance.shared
  
  @available(*, deprecated, message: "Use getCallEvents() instead.")
  @objc
  func getCallWhileMovingEvents(
    _ transportId: String,
    resolver resolve: RCTPromiseResolveBlock,
    rejecter reject: RCTPromiseRejectBlock
  ) {
    guard ensureSDKInitialized(reject) else { return }
    resolve(
      sentiance.getCallsWhileMovingEvents(forTransportId:transportId)
        .map {$0.sentiance.asDictionary()}
    )
  }
  
  @objc
  func getWrongWayDrivingEvents(
    _ transportId: String,
    resolver resolve: RCTPromiseResolveBlock,
    rejecter reject: RCTPromiseRejectBlock
  ) {
    guard ensureSDKInitialized(reject) else { return }
    resolve(
      sentiance.getWrongWayDrivingEvents(forTransportId:transportId)
        .map {$0.sentiance.asDictionary()}
    )
  }
  
  @objc
  func getHarshDrivingEvents(
    _ transportId: String,
    resolver resolve: RCTPromiseResolveBlock,
    rejecter reject: RCTPromiseRejectBlock
  ) {
    guard ensureSDKInitialized(reject) else { return }
    resolve(
      sentiance.getHarshDrivingEvents(forTransportId:transportId)
        .map {$0.sentiance.asDictionary()}
    )
  }
  
  @objc
  func getPhoneUsageEvents(
    _ transportId: String,
    resolver resolve: RCTPromiseResolveBlock,
    rejecter reject: RCTPromiseRejectBlock
  ) {
    guard ensureSDKInitialized(reject) else { return }
    resolve(
      sentiance.getPhoneUsageEvents(forTransportId:transportId)
        .map {$0.sentiance.asDictionary()}
    )
  }
  
  @objc
  func getSpeedingEvents(
    _ transportId: String,
    resolver resolve: RCTPromiseResolveBlock,
    rejecter reject: RCTPromiseRejectBlock
  ) {
    guard ensureSDKInitialized(reject) else { return }
    resolve(
      sentiance.getSpeedingEvents(forTransportId:transportId)
        .map {$0.sentiance.asDictionary()}
    )
  }
  
  @objc
  func getCallEvents(
    _ transportId: String,
    resolver resolve: RCTPromiseResolveBlock,
    rejecter reject: RCTPromiseRejectBlock
  ) {
    guard ensureSDKInitialized(reject) else { return }
    resolve(
      sentiance.getCallEvents(forTransportId:transportId)
        .map {$0.sentiance.asDictionary()}
    )
  }
  
  private func ensureSDKInitialized(_ reject: RCTPromiseRejectBlock) -> Bool {
    guard sentiance.initState == SENTSDKInitState.initialized else {
      reject(sdkNotInitializedError.code, sdkNotInitializedError.message, nil)
      return false
    }
    return true
  }
  
  @objc
  static func requiresMainQueueSetup() -> Bool {
    return false
  }
}
