import UIKit
import Shared
import Combine

public final class DrawerLoadingRetry: DrawerItem {
    public var retryPublisher: AnyPublisher<Void, Never> {
        retrySubject.eraseToAnyPublisher()
    }

    private let view = UIView()
    private let retryButton = UIButton()
    private let stackView = UIStackView()
    private var cancellables = Set<AnyCancellable>()
    private let activityIndicator = UIActivityIndicatorView()
    private let retrySubject = PassthroughSubject<Void, Never>()

    public var spacingAfter: CGFloat? = 0

    public init(spacingAfter: CGFloat? = 10) {
        self.spacingAfter = spacingAfter
        self.activityIndicator.style = .large
        self.activityIndicator.hidesWhenStopped = true
    }

    public func startSpinning() {
        activityIndicator.startAnimating()
        retryButton.isHidden = true
    }

    public func stopSpinning(withRetry retry: Bool) {
        guard retry else { view.isHidden = true; return }

        retryButton.isHidden = false
        activityIndicator.stopAnimating()
        retryButton.setTitle("Retry", for: .normal)
        retryButton.setTitleColor(.red, for: .normal)

        retryButton.titleLabel?.numberOfLines = 0
        retryButton.titleLabel?.textAlignment = .center
        retryButton.titleLabel?.font = Fonts.Mulish.bold.font(size: 16.0)
    }

    public func makeView() -> UIView {
        stackView.axis = .vertical
        stackView.addArrangedSubview(activityIndicator)
        stackView.addArrangedSubview(retryButton)

        retryButton
            .publisher(for: .touchUpInside)
            .sink { [weak retrySubject] in retrySubject?.send() }
            .store(in: &cancellables)

        view.addSubview(stackView)
        stackView.snp.makeConstraints { $0.edges.equalToSuperview() }
        return view
    }
}