//
//  LiveScannerUI.swift
//  DWP
//
//  Created by Ahmed Wahdan on 19/12/2024.
//

import UIKit

@available(iOS 13, *)
class LiveScannerUI {
    private var cardNumberLabel: UILabel?
    private var expiryDateLabel: UILabel?
    private var cardholderNameLabel: UILabel?
    private var cardTypeLabel: UILabel?
    private var lastFrameImageView: UIImageView?

    /// Set up the UI components for displaying card data
    func setupCardDataLabels(in parentView: UIView) {
        if cardNumberLabel == nil {
            cardNumberLabel = createLabel(withText: "Card Number: ", parentView: parentView, topOffset: 20)
        }
        if expiryDateLabel == nil {
            expiryDateLabel = createLabel(withText: "Expiry Date: ", parentView: parentView, topOffset: 70)
        }
        if cardholderNameLabel == nil {
            cardholderNameLabel = createLabel(withText: "Cardholder Name: ", parentView: parentView, topOffset: 120)
        }
        if cardTypeLabel == nil {
            cardTypeLabel = createLabel(withText: "Card Type: ", parentView: parentView, topOffset: 170)
        }
      
      if lastFrameImageView == nil {
        lastFrameImageView = UIImageView(frame: parentView.bounds)
        lastFrameImageView?.contentMode = .scaleAspectFill
        lastFrameImageView?.isHidden = true
        parentView.addSubview(lastFrameImageView!)
      }
    }

    /// Helper function to create a label
    private func createLabel(withText text: String, parentView: UIView, topOffset: CGFloat) -> UILabel {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = text
        label.textAlignment = .center
        label.textColor = .white.withAlphaComponent(0.8)
        label.backgroundColor = .black.withAlphaComponent(0.4)
        label.font = UIFont.boldSystemFont(ofSize: 18)
        label.alpha = 0
        label.layer.cornerRadius = 20
        label.clipsToBounds = true
        parentView.addSubview(label)
        
        NSLayoutConstraint.activate([
            label.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 20),
            label.trailingAnchor.constraint(equalTo: parentView.trailingAnchor, constant: -20),
            label.topAnchor.constraint(equalTo: parentView.topAnchor, constant: topOffset),
            label.heightAnchor.constraint(equalToConstant: 40)
        ])
        return label
    }

    /// Updates the labels with detected card data
    func updateCardDataLabels(cardNumber: String?, expiryDate: String?, cardholderName: String?, cardType: String?) {
        DispatchQueue.main.async {
            if let cardNumber = cardNumber {
                self.cardNumberLabel?.text = "Card Number: \(cardNumber)"
                self.cardNumberLabel?.alpha = 1
            }
            if let expiryDate = expiryDate {
                self.expiryDateLabel?.text = "Expiry Date: \(expiryDate)"
                self.expiryDateLabel?.alpha = 1
            }
            if let cardholderName = cardholderName {
                self.cardholderNameLabel?.text = "Cardholder Name: \(cardholderName)"
                self.cardholderNameLabel?.alpha = 1
            }
            if let cardType = cardType {
                self.cardTypeLabel?.text = "Card Type: \(cardType)"
                self.cardTypeLabel?.alpha = 1
            }
        }
    }

    /// Resets the labels and hides the image view
    func resetLabels() {
        DispatchQueue.main.async {
            self.cardNumberLabel?.text = "Card Number: "
            self.cardNumberLabel?.alpha = 0
            self.expiryDateLabel?.text = "Expiry Date: "
            self.expiryDateLabel?.alpha = 0
            self.cardholderNameLabel?.text = "Cardholder Name: "
            self.cardholderNameLabel?.alpha = 0
            self.cardTypeLabel?.text = "Card Type: "
            self.cardTypeLabel?.alpha = 0
            self.lastFrameImageView?.isHidden = true
        }
    }

    /// Display the last captured image
    func displayLastCapturedImage(_ image: UIImage) {
        DispatchQueue.main.async {
            self.lastFrameImageView?.image = image
            self.lastFrameImageView?.isHidden = false
        }
    }
}
