// Copyright © 2022 Olo Inc. All rights reserved.
// This software is made available under the Olo Pay SDK License (See LICENSE.md file)

import UIKit
import OloPaySDK
import PassKit

@objc(DigitalWalletButton)
public class DigitalWalletButton: UIView {
    private var applePayButton: PKPaymentButton?

    @objc public var onClicked: (() -> Void)?

    @objc public var isEnabled: Bool = true {
        didSet {
            updateButtonState()
        }
    }

    private var applePayConfig: [String: Any] = [:]

    public override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupView()
    }

    private func setupView() {
        setupApplePayButton()
    }

    private func setupApplePayButton() {
        let button = PKPaymentButton(paymentButtonType: .plain, paymentButtonStyle: .black)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

        addSubview(button)
        NSLayoutConstraint.activate([
            button.leadingAnchor.constraint(equalTo: leadingAnchor),
            button.trailingAnchor.constraint(equalTo: trailingAnchor),
            button.topAnchor.constraint(equalTo: topAnchor),
            button.bottomAnchor.constraint(equalTo: bottomAnchor)
        ])

        applePayButton = button
    }

    @objc private func buttonTapped() {
        onClicked?()
    }

    private func updateButtonState() {
        applePayButton?.isUserInteractionEnabled = isEnabled
        applePayButton?.alpha = isEnabled ? 1.0 : 0.5
    }

    @objc public func updateApplePayConfig(_ config: NSDictionary) {
        applePayConfig = config as? [String: Any] ?? [:]

        // Update Apple Pay button based on config
        if let button = applePayButton {
            // Remove old button
            button.removeFromSuperview()

            // Create new button with config
            let buttonType = parseApplePayButtonType(config["buttonType"] as? String)
            let buttonStyle = parseApplePayButtonStyle(config["buttonStyle"] as? String)

            let newButton = PKPaymentButton(paymentButtonType: buttonType, paymentButtonStyle: buttonStyle)
            newButton.translatesAutoresizingMaskIntoConstraints = false
            newButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)

            // Apply corner radius if specified
            if let cornerRadius = config["cornerRadius"] as? CGFloat {
                newButton.layer.cornerRadius = cornerRadius
                newButton.layer.masksToBounds = true
            }

            addSubview(newButton)
            NSLayoutConstraint.activate([
                newButton.leadingAnchor.constraint(equalTo: leadingAnchor),
                newButton.trailingAnchor.constraint(equalTo: trailingAnchor),
                newButton.topAnchor.constraint(equalTo: topAnchor),
                newButton.bottomAnchor.constraint(equalTo: bottomAnchor)
            ])

            applePayButton = newButton
            updateButtonState()
        }
    }

    private func parseApplePayButtonType(_ type: String?) -> PKPaymentButtonType {
        switch type {
        case "buy":
            return .buy
        case "checkout":
            return .checkout
        case "book":
            return .book
        case "donate":
            return .donate
        case "inStore":
            return .inStore
        case "subscribe":
            return .subscribe
        case "reload":
            if #available(iOS 14.0, *) {
                return .reload
            } else {
                return .plain
            }
        case "addMoney":
            if #available(iOS 14.0, *) {
                return .addMoney
            } else {
                return .plain
            }
        case "topUp":
            if #available(iOS 14.0, *) {
                return .topUp
            } else {
                return .plain
            }
        case "order":
            if #available(iOS 14.0, *) {
                return .order
            } else {
                return .plain
            }
        case "rent":
            if #available(iOS 14.0, *) {
                return .rent
            } else {
                return .plain
            }
        case "support":
            if #available(iOS 14.0, *) {
                return .support
            } else {
                return .plain
            }
        case "contribute":
            if #available(iOS 14.0, *) {
                return .contribute
            } else {
                return .plain
            }
        case "tip":
            if #available(iOS 14.0, *) {
                return .tip
            } else {
                return .plain
            }
        default:
            return .plain
        }
    }

    private func parseApplePayButtonStyle(_ style: String?) -> PKPaymentButtonStyle {
        switch style {
        case "white":
            return .white
        case "whiteOutline":
            return .whiteOutline
        case "black":
            return .black
        case "automatic":
            if #available(iOS 14.0, *) {
                return .automatic
            } else {
                return .black
            }
        default:
            return .black
        }
    }
}