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

import Foundation
import React

@objc class PaymentCardCvvView : OloPayView {
    private var cvvViewController: PaymentCardCvvViewController? {
        get { return viewController as? PaymentCardCvvViewController }
    }
    
    @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 cvvViewController = cvvViewController else {
            return
        }
        
        cvvViewController.view.frame = frame
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        reactSuperview().setNeedsLayout()
    }
    
    @objc public var isEnabled = true {
        didSet {
            guard let cvvViewController = cvvViewController else {
                viewIsDirty = true
                return
            }
            
            cvvViewController.isEnabled = isEnabled
        }
    }
    
    @objc public var placeholder: String = "CVV" {
        didSet {
            guard let cvvViewController = cvvViewController else {
                viewIsDirty = true
                return
            }

            cvvViewController.placeholder = placeholder
        }
    }
    
    @objc public var customErrorMessages = NSDictionary() {
        didSet {
            guard let cvvViewController = cvvViewController else {
                viewIsDirty = true
                return
            }
            
            cvvViewController.customErrorMessages = customErrorMessages
        }
    }
    
    @objc override var intrinsicContentSize: CGSize {
        get {
            guard let cvvViewController = cvvViewController else {
                return CGSize(width: 0, height: 0)
            }
            
            return cvvViewController.view.intrinsicContentSize
        }
    }
    
    @objc public var cvvStyles = NSDictionary() {
        didSet {
            guard let cvvViewController = cvvViewController else {
                viewIsDirty = true
                return
            }
            
            cvvViewController.cvvStyles = cvvStyles
        }
    }
    
    override func createViewController() -> UIViewController {
        return PaymentCardCvvViewController()
    }
    
    @objc public func focus() { cvvViewController?.focus() }
    @objc public func blur() { cvvViewController?.blur() }
    @objc public func clear() { cvvViewController?.clear() }
    
    @objc public func createCvvUpdateToken(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
        cvvViewController?.createCvvUpdateToken(resolve: resolve, reject: reject)
    }
    
    @objc var onCvvChangeEvent: RCTDirectEventBlock? = nil {
        didSet {
            guard let cvvViewController = cvvViewController else {
                viewIsDirty = true
                return
            }

            cvvViewController.onCvvChange = onCvvChangeEvent
        }
    }

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

            cvvViewController.onFocus = onFocusEvent
        }
    }

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

            cvvViewController.onBlur = onBlurEvent
        }
    }
    
    override func updateAllProperties() {
        guard let cvvViewController = cvvViewController else {
            return
        }
        
        cvvViewController.isEnabled = isEnabled
        cvvViewController.placeholder = placeholder
        cvvViewController.customErrorMessages = customErrorMessages
        cvvViewController.cvvStyles = cvvStyles
        cvvViewController.onCvvChange = onCvvChangeEvent
        cvvViewController.onFocus = onFocusEvent
        cvvViewController.onBlur = onBlurEvent
    }
}
