//
//  PlacementInteractor.swift
//  AirbridgeReactNative
//
//  Created by WOF on 7/8/24.
//

import React
import Airbridge

@objc(PlacementInteractor)
class PlacementInteractor: RCTEventEmitter {
    @objc(click:trackingLink:onSuccess:onFailure:)
    func click(
        _ promiseID: String,
        _ trackingLink: String,
        _ onSuccess: @escaping RCTResponseSenderBlock,
        _ onFailure: @escaping RCTResponseSenderBlock
    ) {
        guard let url = URL(string: trackingLink) else { return }
        
        let handled = Airbridge.click(trackingLink: url) {
            onSuccess([])
        } onFailure: { error in
            onFailure([error.localizedDescription])
        }
        sendEvent(
            withName: "airbridge.placement",
            body: [
                "id": promiseID,
                "type": "onResolve",
                "value": handled,
            ]
        )
    }
    
    @objc(impression:trackingLink:onSuccess:onFailure:)
    func impression(
        _ promiseID: String,
        _ trackingLink: String,
        _ onSuccess: @escaping RCTResponseSenderBlock,
        _ onFailure: @escaping RCTResponseSenderBlock
    ) {
        guard let url = URL(string: trackingLink) else { return }
        
        let handled = Airbridge.impression(trackingLink: url) {
            onSuccess([])
        } onFailure: { error in
            onFailure([error.localizedDescription])
        }
        sendEvent(
            withName: "airbridge.placement",
            body: [
                "id": promiseID,
                "type": "onResolve",
                "value": handled,
            ]
        )
    }

    @objc(createTrackingLink:option:onSuccess:onFailure:)
    func createTrackingLink(
        _ channel: String,
        _ option: [String: Any],
        _ onSuccess: @escaping RCTResponseSenderBlock,
        _ onFailure: @escaping RCTResponseSenderBlock
    ) {
        Airbridge.createTrackingLink(
            channel: channel,
            option: option,
            onSuccess: {
                onSuccess([[
                    "shortURL": $0.shortURL.absoluteString,
                    "qrcodeURL": $0.qrcodeURL.absoluteString
                ]])
            },
            onFailure: { error in
                onFailure([error.localizedDescription])
            }
        )
    }
    
    override func supportedEvents() -> [String]! {
        ["airbridge.placement"]
    }
    
    override class func requiresMainQueueSetup() -> Bool {
        true
    }
    
    override var methodQueue: dispatch_queue_t! {
        DispatchQueue.main
    }
}
