//
//  SentianceFeedback.swift
//  SentianceEventTimeline
//
//  Created by Mohammed Aouf Zouag on 22/10/2025.
//

import Foundation
import SENTSDK

@objc(SentianceFeedback)
class SentianceFeedback: NSObject {

    private let sentiance = Sentiance.shared

    @objc
    func submitOccupantRoleFeedback(
        _ transportId: String,
        feedbackOccupantRole: String,
        resolver resolve: RCTPromiseResolveBlock,
        rejecter reject: RCTPromiseRejectBlock
    ) {
        guard ensureSDKInitialized(reject) else { return }
        guard let feedbackApi = requireFeedbackApiOrReject(reject) else { return }
        guard let occupantRoleFeedback = feedbackOccupantRole.sentiance.asOccupantRoleFeedback() else {
            rejectPromise(reject, .INVALID_OCCUPANT_ROLE_FEEDBACK)
            return
        }

        let result = feedbackApi.submitOccupantRoleFeedback(transportId: transportId, feedbackRole: occupantRoleFeedback)
        resolve(result.sentiance.toJsString())
    }

    @objc
    func submitVehicleCrashDetectionFeedback(
        _ vehicleCrashFeedbackDict: [String: Any],
        resolver resolve: RCTPromiseResolveBlock,
        rejecter reject: RCTPromiseRejectBlock
    ) {
        guard ensureSDKInitialized(reject) else { return }
        guard let feedbackApi = requireFeedbackApiOrReject(reject) else { return }
        guard let feedback = vehicleCrashFeedbackDict.sentiance.asVehicleCrashFeedback() else {
            rejectPromise(reject, .INVALID_VEHICLE_CRASH_FEEDBACK)
            return
        }

        let result = feedbackApi.submitVehicleCrashDetectionFeedback(feedback: feedback)
        resolve(result.sentiance.toJsString())
    }

    private func ensureSDKInitialized(_ reject: RCTPromiseRejectBlock) -> Bool {
        guard sentiance.initState == SENTSDKInitState.initialized else {
            rejectPromise(reject, .E_SDK_NOT_INITIALIZED)
            return false
        }
        return true
    }

    private func requireFeedbackApiOrReject(_ reject: RCTPromiseRejectBlock) -> SENTFeedback? {
        guard let api = Sentiance.shared.feedback else {
            rejectPromise(reject, .FEEDBACK_SERVICE_NOT_AVAILABLE)
            return nil
        }
        return api
    }

    private func rejectPromise(_ reject: RCTPromiseRejectBlock, _ errorCode: FeedbackErrorCodes) {
        reject(errorCode.rawValue, errorCode.description, nil)
    }

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

enum FeedbackErrorCodes : String, CaseIterable {
    case E_SDK_NOT_INITIALIZED
    case FEEDBACK_SERVICE_NOT_AVAILABLE
    case INVALID_OCCUPANT_ROLE_FEEDBACK
    case INVALID_VEHICLE_CRASH_FEEDBACK
}
