// Copyright © 2022 Olo Inc. All rights reserved.
// This software is made available under the Olo Pay SDK License (See LICENSE.md file)
//
//  PaymentCardCvvViewManager.swift
//  OlopaysdkReactNative
//
//  Created by Justin Anderson on 8/23/23.
//  Copyright © 2023 Facebook. All rights reserved.
//

import Foundation
import React

@objc(PaymentCardCvvViewManager)
class PaymentCardCvvViewManager : RCTViewManager {
    @objc override func view() -> UIView! {
        return PaymentCardCvvView()
    }
    
    @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(clear:withResolver:withRejecter:)
    public func clear(_ node: NSNumber, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) -> Void {
        DispatchQueue.main.sync {
            guard let view = findView(node, reject: reject) else {
                return
            }

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

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

        return view
    }
}
