// Copyright © 2022 Olo Inc. All rights reserved.
// This software is made available under the Olo Pay SDK License (See LICENSE.md file)
//
//  PaymentCardDetailsFormManager.swift
//  OlopaysdkReactNative
//
//  Created by Richard Dowdy on 4/13/23.
//  Copyright © 2023 Facebook. All rights reserved.
//

import Foundation
import React
import OloPaySDK

@objc(PaymentCardDetailsFormManager)
class PaymentCardDetailsFormManager : RCTViewManager {
    @objc override func view() -> UIView! {
        return PaymentCardDetailsForm()
    }

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

    @objc(focus:withResolver:withRejecter:)
    public func focus(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
        DispatchQueue.main.sync {
            guard let view = findView(node, reject: reject) else {
                return
            }

            view.focus()
        }
    }

    @objc(blur:withResolver:withRejecter:)
    public func blur(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
        DispatchQueue.main.sync {
            guard let view = findView(node, reject: reject) else {
                return
            }

            view.blur()
        }
    }

    @objc(createPaymentMethod:withResolver:withRejecter:)
    public func createPaymentMethod(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
        DispatchQueue.main.sync {
            guard let view = findView(node, reject: reject) else {
                return
            }

            view.createPaymentMethod(resolve: resolve, reject: reject)
        }
    }

    public func findView(_ node: NSNumber, reject: RCTPromiseRejectBlock) -> PaymentCardDetailsForm? {
        guard let view = self.bridge.uiManager.view(forReactTag: node) as? PaymentCardDetailsForm else {
            reject(ErrorCodes.ViewNotFound, "Native view not found", nil)
            return nil
        }

        return view
    }
}

