import UIKit

class PAMLoadingManager {
  private static let loadingViewTag = 9999
  private static var loadingCount: Int = 0
  private static var loadingView: UIView?

  var indicatorColor = UIColor.darkGray
  var backgroundAlpha: Double = 0.2

  private let getKeyWindow: () -> UIWindow?

  init(getKeyWindow: @escaping () -> UIWindow?) {
    self.getKeyWindow = getKeyWindow
  }

  func showLoading() {
    DispatchQueue.main.async {
      PAMLoadingManager.loadingCount += 1
      guard PAMLoadingManager.loadingCount == 1,
            let window = self.getKeyWindow() else { return }

      let view = UIView(frame: window.bounds)
      view.backgroundColor = UIColor.black.withAlphaComponent(self.backgroundAlpha)
      view.alpha = 0.0

      let indicator = UIActivityIndicatorView(style: .large)
      indicator.color = self.indicatorColor
      indicator.center = view.center
      indicator.startAnimating()
      view.addSubview(indicator)

      PAMLoadingManager.loadingView = view
      window.addSubview(view)
      view.fadeIn()
    }
  }

  func hideLoading() {
    DispatchQueue.main.async {
      guard PAMLoadingManager.loadingCount > 0 else { return }
      PAMLoadingManager.loadingCount -= 1
      guard PAMLoadingManager.loadingCount == 0,
            let view = PAMLoadingManager.loadingView else { return }
      view.fadeOutAndRemove()
      PAMLoadingManager.loadingView = nil
    }
  }

  func forceHideLoading() {
    DispatchQueue.main.async {
      if let view = PAMLoadingManager.loadingView {
        view.fadeOutAndRemove()
        PAMLoadingManager.loadingView = nil
      }
      PAMLoadingManager.loadingCount = 0
    }
  }
}
