local binary_name = "textlint"
local severities = {
    vim.diagnostic.severity.WARN,
    vim.diagnostic.severity.ERROR,
}

return {
    cmd = function()
        local local_binary = vim.fn.fnamemodify("./node_modules/.bin/" .. binary_name, ":p")
        return vim.uv.fs_stat(local_binary) and local_binary or binary_name
    end,
    args = {
        "--format",
        "json",
        "--stdin",
        "--stdin-filename",
        function()
            return vim.api.nvim_buf_get_name(0)
        end,
    },
    stdin = true,
    stream = "stdout",
    ignore_exitcode = true,
    parser = function(output)
        if output == "" then
            return {}
        end
        local decoded = vim.json.decode(output)
        if decoded == nil then
            return {}
        end
        local diagnostics = {}
        for _, value in ipairs(decoded) do
            for _, item in ipairs(value.messages) do
                table.insert(diagnostics, {
                    message = item.message,
                    col = item.loc.start.column - 1,
                    end_col = item.loc["end"].column - 1,
                    lnum = item.loc.start.line - 1,
                    end_lnum = item.loc["end"].line - 1,
                    code = item.ruleId,
                    severity = severities[item.severity],
                    source = "textlint",
                })
            end
        end
        return diagnostics
    end,
}