import SwiftUI

struct DocumentsView: View {
    var directoryURL: URL?

    @ObservedObject private var model = DocumentsModel.shared

    var body: some View {
        ScrollView(.vertical, showsIndicators: false) {
            if let url, model.directoryContents(url).isEmpty {
                NoDocumentsView()
            } else if let url {
                ForEach(model.sortedDirectoryContents(url), id: \.absoluteString) { url in
                    let standardizedURL = model.standardizedURL(url) ?? url
                    let video = Video.local(standardizedURL)

                    Group {
                        if model.isDirectory(standardizedURL) {
                            NavigationLink(destination: Self(directoryURL: url)) {
                                VideoBanner(video: video)
                            }
                        } else {
                            PlayerQueueRow(item: PlayerQueueItem(video))
                        }
                    }
                    .contextMenu {
                        VideoContextMenuView(video: video)
                    }
                }
                .id(model.refreshID)
                .transition(.opacity)
            }
            Color.clear.padding(.bottom, 50)
        }
        .navigationTitle(directoryLabel)
        .padding(.horizontal)
        .navigationBarTitleDisplayMode(RefreshControl.navigationBarTitleDisplayMode)
        .backport
        .refreshable {
            DispatchQueue.main.async {
                self.refresh()
            }
        }
    }

    var url: URL? {
        directoryURL ?? model.documentsDirectory
    }

    var directoryLabel: String {
        guard let directoryURL else { return "Documents" }
        return model.displayLabelForDocument(directoryURL)
    }

    func refresh() {
        withAnimation {
            model.refresh()
        }
    }
}

struct DocumentsView_Previews: PreviewProvider {
    static var previews: some View {
        NavigationView {
            DocumentsView()
        }
        .injectFixtureEnvironmentObjects()
        .navigationViewStyle(.stack)
    }
}