import APIClient
import AVFoundation
import ComponentLibrary
import ComposableArchitecture
import CoreMedia
import FeatureHooksModels
import FeatureToasts
import Foundation
import Localization
import LyricsClient
import OSLog
import SnippetPlayerClient
import SwiftUI
import Utilities
import Waveform

@Reducer
public struct HooksEditorSnippetSelectionReducer {
    @ObservableState
    public struct State: Equatable {
        public let initialStartTime: TimeInterval
        public let initialEndTime: TimeInterval

        public var windowDuration: TimeInterval {
            max(initialEndTime - initialStartTime, 0)
        }

        public init(
            startTime: Double,
            endTime: Double
        ) {
            self.initialStartTime = startTime
            self.initialEndTime = endTime
        }
    }

    public enum Action {
        public enum Delegate {
            case backTapped(originalSnippetRange: ClosedRange<TimeInterval>)
            case confirmSelectionTapped

            case waveformDragStarted
            case waveformDragUpdated(ClosedRange<TimeInterval>)
            case waveformDragEnded(ClosedRange<TimeInterval>)
            case timeSelectionChanged(ClosedRange<TimeInterval>)
        }

        case delegate(Delegate)
    }

    public init() {}

    @Dependency(APIClientV2.self) var api
    @Dependency(\.snippetPlayerClient) var snippetPlayerClient
    @Dependency(\.toastClient.show) var showToast

    public var body: some ReducerOf<Self> {
        Reduce<State, Action> { _, action in
            switch action {
            // Actions handled in parent
            case .delegate:
                return .none
            }
        }
    }
}
