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

import Foundation
import OloPaySDK

@objc class PaymentCardDetailsFormController : UIViewController, OPPaymentCardDetailsFormDelegate {
    private let _cardDetails = OPPaymentCardDetailsForm()

    @objc public func focus() { let _ = _cardDetails.becomeFirstResponder() }
    @objc public func blur() { let _ = _cardDetails.resignFirstResponder() }
    
    @objc public func createPaymentMethod(resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
        
        guard let params = _cardDetails.getPaymentMethodParams() else {
            reject(ErrorCodes.InvalidCardDetails, "Card details are invalid", nil)
            return
        }

        OloPayAPI().createPaymentMethod(with: params) { paymentMethod, error in
            if (error != nil) {
                rejectError(error: error!, reject: reject)
                return
            }

            guard let paymentMethod = paymentMethod else {
                reject(ErrorCodes.GeneralError, "Unexpected error occurred", nil)
                return
            }

            resolve(paymentMethod.toDictionary())
        }
    }

    @objc var onFocus: RCTDirectEventBlock? = nil
    @objc var onBlur: RCTDirectEventBlock? = nil
    @objc var onFormComplete: RCTDirectEventBlock? = nil
    
    func isValidChanged(_ form: OPPaymentCardDetailsForm, _ isValid: Bool) {
        let cardDetailsValid = [
            DataKeys.IsValidKey: isValid,
        ] as [String : Any]
        
        
        onFormComplete?(cardDetailsValid)
    }

    @objc public var cardStyles: NSDictionary = NSDictionary() {
        didSet {
            if let backgroundColor = cardStyles[DataKeys.BackgroundColorKey] as? String {
                _cardDetails.backgroundColor = UIColor(hex: backgroundColor)
            }

            if let cursorColor = cardStyles[DataKeys.CursorColorKey] as? String {
                _cardDetails.tintColor = UIColor(hex: cursorColor)
            }
        }
    }
    
    @objc public var isEnabled: Bool = true {
        didSet {
            _cardDetails.isUserInteractionEnabled = isEnabled
        }
    }

    @objc override func viewDidLoad() {
        setupViews()
    }

    func setupViews() {
        self.view.addSubview(_cardDetails)
        _cardDetails.cardDetailsDelegate = self

        _cardDetails.translatesAutoresizingMaskIntoConstraints = false
        let constraints = [
            _cardDetails.topAnchor.constraint(equalTo: self.view.topAnchor),
            _cardDetails.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            _cardDetails.leftAnchor.constraint(equalTo: self.view.leftAnchor),
            _cardDetails.rightAnchor.constraint(equalTo: self.view.rightAnchor)
        ]

        NSLayoutConstraint.activate(constraints)
    }
}
