import Foundation
import UIKit
import Lottie

class ProgressAndModal: HybridProgressAndModalSpec {

  // ─── Managers ───────────────────────────────────────────────────────────────
  private lazy var loadingManager = PAMLoadingManager(getKeyWindow: { [weak self] in self?.getKeyWindow() })
  private lazy var lottieManager = PAMLottieManager(getKeyWindow: { [weak self] in self?.getKeyWindow() })
  private lazy var toastManager = PAMToastManager(getKeyWindow: { [weak self] in self?.getKeyWindow() })

  // ─── Init ────────────────────────────────────────────────────────────────────
  override init() {
    super.init()
  }

  // ─── Native API ──────────────────────────────────────────────────────────────
  public func configure(params: PAM_ConfigParams) throws {
    if let alpha = params.backgroundAlpha {
      loadingManager.backgroundAlpha = alpha
      lottieManager.backgroundAlpha = alpha
    }
    if let hexColor = params.indicatorColor {
      loadingManager.indicatorColor = UIColor(hex: hexColor)
    }
    toastManager.configure()
  }

  public func showLoading() throws {
    loadingManager.showLoading()
  }

  public func hideLoading() throws {
    loadingManager.hideLoading()
  }

  public func forceHideLoading() throws {
    loadingManager.forceHideLoading()
  }

  public func showLottie(params: PAM_LottieLoadingParams) throws {
    lottieManager.showLottie(params: params)
  }

  public func hideLottie(params: PAM_LottieLoadingParams) throws {
    lottieManager.hideLottie(params: params)
  }

  public func showToast(params: PAM_ToastParams) {
    toastManager.showToast(params: params) { [weak self] completion in
      self?.loadImage(from: params.image, completion: completion)
    }
  }

  // ─── Helpers ─────────────────────────────────────────────────────────────────
  private func getKeyWindow() -> UIWindow? {
    return UIApplication.shared.connectedScenes
      .filter { $0.activationState == .foregroundActive }
      .compactMap { ($0 as? UIWindowScene)?.windows.first(where: { $0.isKeyWindow }) }
      .first
  }

  private func loadImage(from source: PAM_NativeAssetSource?, completion: @escaping (UIImage?) -> Void) {
    guard let source = source else { completion(nil); return }
    let uri = source.uri
    if uri.hasPrefix("http://") || uri.hasPrefix("https://") {
      guard let url = URL(string: uri) else { completion(nil); return }
      URLSession.shared.dataTask(with: url) { data, _, _ in
        if let data = data, let img = UIImage(data: data) {
          DispatchQueue.main.async { completion(img) }
        } else {
          DispatchQueue.main.async { completion(nil) }
        }
      }.resume()
    } else if uri.hasPrefix("file://") {
      if let url = URL(string: uri) { completion(UIImage(contentsOfFile: url.path)) }
      else { completion(nil) }
    } else {
      completion(UIImage(named: uri) ?? UIImage(contentsOfFile: uri))
    }
  }
}
