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

import Foundation

// This class is the view that is exposed to React Native. Internally everything gets
// redirected to PaymentCardDetailsFormController. When this view runs through the first layout
// pass the following things take place (in the embed() method):
// 1. A PaymentCardDetailsFormController instance is created and added as a child to this
//    view's parentViewController, which is controlled by React Native
// 2. The PaymentCardDetailsFormController's view is added as a subview to this
//    PaymentCardDetailsForm instance
// 3. The view controller created in step 1 gets the same frame size as the bounds of this view
//
// This is all done pre-emptively to support view controllers. There is a future payment processor
// that may be added to the Olo Pay SDK that only works with view controllers. As a result, the Olo Pay
// iOS SDK may deprecate it's views and switch to using view controllers. If that happens, we may
// end up removing PaymentCardDetailsFormController and using the view controller exposed by the
// iOS SDK, but all the major plumbing to support view controllers in React Native will already
// be in place, leading to a smoother transition
@objc class PaymentCardDetailsForm : OloPayView {
    private var paymentViewController: PaymentCardDetailsFormController? {
        get { return viewController as? PaymentCardDetailsFormController }
    }
    
    @objc override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    @objc required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // This method allows React Native to change the size of the native view
    // to keep the native view and it's React Native host view size in sync
    override func reactSetFrame(_ frame: CGRect) {
        super.reactSetFrame(frame)
        self.frame = frame
        
        guard let paymentViewController = paymentViewController else {
            return
        }
        
        paymentViewController.view.frame = frame
    }
    
    @objc public func focus() { paymentViewController?.focus() }
    @objc public func blur() { paymentViewController?.blur() }
    
    @objc public func createPaymentMethod(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
        paymentViewController?.createPaymentMethod(resolve: resolve, reject: reject)
    }
    

    @objc var onFocusEvent: RCTDirectEventBlock? = nil {
        didSet {
            guard let paymentViewController = paymentViewController else {
                viewIsDirty = true
                return
            }

            paymentViewController.onFocus = onFocusEvent
        }
    }


    @objc var onBlurEvent: RCTDirectEventBlock? = nil {
        didSet {
            guard let paymentViewController = paymentViewController else {
                viewIsDirty = true
                return
            }

            paymentViewController.onBlur = onBlurEvent
        }
    }
    
    @objc var onFormCompleteEvent: RCTDirectEventBlock? = nil {
        didSet {
            guard let paymentViewController = paymentViewController else {
                viewIsDirty = true
                return
            }

            paymentViewController.onFormComplete = onFormCompleteEvent
        }
    }

    @objc public var cardStyles: NSDictionary = NSDictionary() {
        didSet {
            guard let paymentViewController = paymentViewController else {
                viewIsDirty = true
                return
            }

            paymentViewController.cardStyles = cardStyles
        }
    }
    
    @objc public var isEnabled: Bool = true {
        didSet {
            guard let paymentViewController = paymentViewController else {
                viewIsDirty = true
                return
            }
            paymentViewController.isEnabled = isEnabled
        }
    }

    override func updateAllProperties() {
        guard let paymentViewController = paymentViewController else {
            return
        }

        paymentViewController.cardStyles = cardStyles
        paymentViewController.onFocus = onFocusEvent
        paymentViewController.onBlur = onBlurEvent
        paymentViewController.onFormComplete = onFormCompleteEvent
        paymentViewController.isEnabled = isEnabled
    }
    
    override func createViewController() -> UIViewController {
        return PaymentCardDetailsFormController()
    }
}
