use napi::bindgen_prelude;
use napi::bindgen_prelude::JsObjectValue;

use super::macros::{
    namespace_event_handler, namespace_field_getter, namespace_function, register_provider,
};
use super::{
    FileSystemWatcher, TextDocument, TextDocumentChangeEvent, TextDocumentContentProvider, Uri,
    WorkspaceFolder, WorkspaceFoldersChangeEvent,
};

namespace_event_handler! {
    "workspace" {
        "onDidChangeTextDocument": on_did_change_text_document(TextDocumentChangeEvent);
        "onDidChangeWorkspaceFolders": on_did_change_workspace_folders(WorkspaceFoldersChangeEvent);
    }
}

namespace_field_getter! {
    "workspace" {
        "textDocuments": get_text_documents -> Vec<TextDocument<'env>>;
        "workspaceFolders": get_workspace_folders -> Vec<WorkspaceFolder<'env>>;
    }
}

namespace_function! {
    "workspace" {
        "createFileSystemWatcher":
            create_file_system_watcher(
                glob_pattern: &str,
            ) -> FileSystemWatcher<'env>;
        "getWorkspaceFolder":
            get_workspace_folder(
                uri: &Uri,
            ) -> Option<WorkspaceFolder<'env>>;
    }
}

register_provider!(
    "workspace",
    "registerTextDocumentContentProvider",
    register_text_document_content_provider(scheme: &str, provider: TextDocumentContentProvider<'env>)
);