local util = require("lspconfig.util")

local function buf_build(bufnr)
    bufnr = util.validate_bufnr(bufnr)
    local texlab_client = util.get_active_client_by_name(bufnr, "texlab")
    local pos = vim.api.nvim_win_get_cursor(0)
    local params = {
        textDocument = { uri = vim.uri_from_bufnr(bufnr) },
        position = { line = pos[1] - 1, character = pos[2] },
    }
    if texlab_client then
        texlab_client.request("textDocument/build", params, function(err, result)
            if err then
                error(tostring(err))
            end
            print("Build " .. texlab_build_status[result.status])
        end, bufnr)
    else
        print("method textDocument/build is not supported by any servers active on the current buffer")
    end
end

local function buf_search(bufnr)
    bufnr = util.validate_bufnr(bufnr)
    local texlab_client = util.get_active_client_by_name(bufnr, "texlab")
    local pos = vim.api.nvim_win_get_cursor(0)
    local params = {
        textDocument = { uri = vim.uri_from_bufnr(bufnr) },
        position = { line = pos[1] - 1, character = pos[2] },
    }
    if texlab_client then
        texlab_client.request("textDocument/forwardSearch", params, function(err, result)
            if err then
                error(tostring(err))
            end
            print("Search " .. texlab_forward_status[result.status])
        end, bufnr)
    else
        print("method textDocument/forwardSearch is not supported by any servers active on the current buffer")
    end
end

-- bufnr isn't actually required here, but we need a valid buffer in order to
-- be able to find the client for buf_request.
-- TODO find a client by looking through buffers for a valid client?
-- local function build_cancel_all(bufnr)
--   bufnr = util.validate_bufnr(bufnr)
--   local params = { token = "texlab-build-*" }
--   lsp.buf_request(bufnr, 'window/progress/cancel', params, function(err, method, result, client_id)
--     if err then error(tostring(err)) end
--     print("Cancel result", vim.inspect(result))
--   end)
-- end

return {
    default_config = {
        filetypes = { "tex", "plaintex", "bib" },
        root_dir = function(fname)
            return util.root_pattern(".latexmkrc")(fname) or util.find_git_ancestor(fname)
        end,
        single_file_support = true,
        settings = {
            texlab = {
                rootDirectory = nil,
                build = {
                    executable = "latexmk",
                    args = { "-pdf", "-interaction=nonstopmode", "-synctex=1", "%f" },
                    onSave = false,
                    forwardSearchAfter = false,
                },
                auxDirectory = ".",
                forwardSearch = {
                    executable = nil,
                    args = {},
                },
                chktex = {
                    onOpenAndSave = false,
                    onEdit = false,
                },
                diagnosticsDelay = 300,
                latexFormatter = "latexindent",
                latexindent = {
                    ["local"] = nil, -- local is a reserved keyword
                    modifyLineBreaks = true,
                },
                bibtexFormatter = "texlab",
                formatterLineLength = 80,
            },
        },
    },
    commands = {
        TexlabBuild = {
            function()
                buf_build(0)
            end,
            description = "Build the current buffer",
        },
        TexlabForward = {
            function()
                buf_search(0)
            end,
            description = "Forward search from current position",
        },
    },
    docs = {
        description = [[
https://github.com/latex-lsp/texlab

A completion engine built from scratch for (La)TeX.

See https://github.com/latex-lsp/texlab/wiki/Configuration for configuration options.
]],
    },
}
