import MobileCoreServices
import SwiftUI
import UniformTypeIdentifiers

public struct DocumentPickerView: UIViewControllerRepresentable {
    enum DocumentPickerError: Error {
        case unableToLoadFile
    }

    let completion: (Result<URL, Error>) -> Void

    public init(completion: @escaping (Result<URL, Error>) -> Void) {
        self.completion = completion
    }

    public func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    public func makeUIViewController(context: Context) -> UIDocumentPickerViewController {
        let picker = UIDocumentPickerViewController(forOpeningContentTypes: [.audio])
        picker.allowsMultipleSelection = false
        picker.delegate = context.coordinator
        return picker
    }

    public func updateUIViewController(_: UIDocumentPickerViewController, context _: Context) {}

    public class Coordinator: NSObject, UIDocumentPickerDelegate {
        let parent: DocumentPickerView

        public init(_ parent: DocumentPickerView) {
            self.parent = parent
        }

        public func documentPicker(_: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
            guard let url = urls.first, url.startAccessingSecurityScopedResource() else {
                parent.completion(.failure(DocumentPickerError.unableToLoadFile))
                return
            }

            parent.completion(.success(url))
        }
    }
}
