//
//  RefreshControl.swift
//  SwiftUI_Pull_to_Refresh
//
//  Created by Geri Borbás on 18/09/2021.
//

import Combine
import Foundation
import SwiftUI
import UIKit

final class RefreshControl: ObservableObject {
    static var navigationBarTitleDisplayMode: NavigationBarItem.TitleDisplayMode {
        if #available(iOS 15.0, *) {
            return .automatic
        }

        return .inline
    }

    let onValueChanged: (_ refreshControl: UIRefreshControl) -> Void

    init(onValueChanged: @escaping ((UIRefreshControl) -> Void)) {
        self.onValueChanged = onValueChanged
    }

    /// Adds a `UIRefreshControl` to the `UIScrollView` provided.
    func add(to scrollView: UIScrollView) {
        scrollView.refreshControl = UIRefreshControl().withTarget(
            self,
            action: #selector(onValueChangedAction),
            for: .valueChanged
        )
        .testable(as: "RefreshControl")
    }

    @objc private func onValueChangedAction(sender: UIRefreshControl) {
        onValueChanged(sender)
    }
}

extension UIRefreshControl {
    /// Convinience method to assign target action inline.
    func withTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event) -> UIRefreshControl {
        addTarget(target, action: action, for: controlEvents)
        return self
    }

    /// Convinience method to match refresh control for UI testing.
    func testable(as id: String) -> UIRefreshControl {
        isAccessibilityElement = true
        accessibilityIdentifier = id
        return self
    }
}