import ComponentLibrary
import ComposableArchitecture
import Foundation
import SwiftUI

// Presents VideoPicker over the root and lets the user
// choose a movie and proceed to the next screen (HooksEditor)
@Reducer
public struct RootMediaPicker {
    @ObservableState
    public struct State: Equatable {
        public var selectedMovie: Movie?
        public var mediaTransferProgress: Double = 0

        public init() {}
    }

    public enum Action {
        case setSelectedMovie(Movie?)
        case setMediaTransferProgress(Double?)
        case selectionComplete
        case cancel
        case delegate(Delegate)

        public enum Delegate {
            case didPick(url: URL)
            case didCancel
        }
    }

    public init() {}

    public var body: some ReducerOf<Self> {
        Reduce<State, Action> { state, action in
            switch action {
            case .setSelectedMovie(let movie):
                state.selectedMovie = movie
                if let url = movie?.url {
                    return .send(.delegate(.didPick(url: url)))
                }
                return .none

            case .setMediaTransferProgress(let progress):
                state.mediaTransferProgress = progress ?? 0
                return .none

            case .selectionComplete:
                return .none

            case .cancel:
                return .send(.delegate(.didCancel))

            case .delegate:
                return .none
            }
        }
    }
}

public struct RootMediaPickerView: View {
    @Bindable var store: StoreOf<RootMediaPicker>

    public init(store: StoreOf<RootMediaPicker>) {
        self.store = store
    }

    public var body: some View {
        VideoPicker(
            selectedMovie: $store.selectedMovie.sending(\.setSelectedMovie),
            transferProgress: $store.mediaTransferProgress.sending(\.setMediaTransferProgress),
            onSelectionComplete: {
                store.send(.selectionComplete)
            },
            onSelectionCancelled: {
                store.send(.cancel)
            },
            onError: { _ in
                store.send(.cancel)
            }
        )
    }
}
