import Adamantium
import AnalyticsClient
import APIClient
import AVFoundation
import AVKit
import CommentsClient
import ComponentLibrary
import ComposableArchitecture
import EventBusClient
import FeatureClipDetail
import FeatureShare
import FeatureShareSheet
import FeatureToasts
import Localization
import PlayerClient
import StatsigClient
import SwiftUI
import Utilities

class VerticalClipScrollView: UIScrollView, UIScrollViewDelegate, UIGestureRecognizerDelegate {
    var verticalContentScrollOffset: ((CGFloat) -> Void)?
    var isVerticalScrollingDisabled: Bool = false {
        didSet {
            isScrollEnabled = !isVerticalScrollingDisabled
        }
    }

    var verticalDragOffsetWhileAtTop: ((CGFloat) -> Void)?

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupScrollView()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupScrollView()
    }

    private func setupScrollView() {
        delegate = self
        showsVerticalScrollIndicator = false
        alwaysBounceVertical = false
        bounces = true
        contentInsetAdjustmentBehavior = .never

        panGestureRecognizer.delegate = self

        contentOffset = .zero

        delaysContentTouches = false
        canCancelContentTouches = true
    }

    func resetScrollPosition(animated: Bool = false) {
        setContentOffset(.zero, animated: animated)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
    }

    // MARK: - UIScrollViewDelegate

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        verticalContentScrollOffset?(scrollView.contentOffset.y)
    }

    // MARK: - UIGestureRecognizerDelegate

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith _: UIGestureRecognizer) -> Bool {
        if let pan = gestureRecognizer as? UIPanGestureRecognizer {
            let velocity = pan.velocity(in: self)
            let translation = pan.translation(in: self)

            // Don't let horizontal gestures or gestures when not at the top
            // interfere with vertical gestures to collapse
            let atTop = contentOffset.y <= -adjustedContentInset.top

            if !atTop || abs(velocity.x) > abs(velocity.y) {
                return false
            }

            if atTop && velocity.y > 0 {
                verticalDragOffsetWhileAtTop?(translation.y)
                // Disable scroll view while at top
                isScrollEnabled = false
                return true
            }
        }

        return true
    }

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        guard let pan = gestureRecognizer as? UIPanGestureRecognizer else { return true }

        let velocity = pan.velocity(in: self)

        // For horizontal pans, always fail and let collection view handle it
        if abs(velocity.x) > abs(velocity.y) {
            return false
        }

        return true
    }
}
