local trigger_chars_add = { "-", "*", "@", "$" }
return {
    "saghen/blink.cmp",
    -- optional: provides snippets for the snippet source
    dependencies = { "rafamadriz/friendly-snippets", "L3MON4D3/LuaSnip" },

    -- use a release tag to download pre-built binaries
    version = "1.*",

    ---@module 'blink.cmp'
    ---@type blink.cmp.Config
    opts = {
        -- 'default' (recommended) for mappings similar to built-in completions (C-y to accept)
        -- 'super-tab' for mappings similar to vscode (tab to accept)
        -- 'enter' for enter to accept
        -- 'none' for no mappings
        --
        -- All presets have the following mappings:
        -- C-space: Open menu or open docs if already open
        -- C-n/C-p or Up/Down: Select next/previous item
        -- C-e: Hide menu
        -- C-k: Toggle signature help (if signature.enabled = true)
        --
        -- See :h blink-cmp-config-keymap for defining your own keymap
        keymap = {
            preset = "super-tab",
            ["<C-k>"] = { "select_prev", "fallback" },
            ["<C-j>"] = { "select_next", "fallback" },
            ["<C-n>"] = { "show_documentation", "hide_documentation" },
            ["<C-S-j>"] = { "scroll_documentation_down", "scroll_signature_down" },
            ["<C-S-k>"] = { "scroll_documentation_up", "scroll_signature_up" },
            ["<C-,>"] = { "snippet_backward", "fallback" },
            ["<C-.>"] = { "snippet_forward", "fallback" },
            ["<Tab>"] = {
                function(cmp)
                    if cmp.snippet_active() then
                        return cmp.accept()
                    else
                        return cmp.select_and_accept()
                    end
                end,
                "fallback",
            },
        },

        appearance = {
            -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font'
            -- Adjusts spacing to ensure icons are aligned
            nerd_font_variant = "mono",
        },

        -- (Default) Only show the documentation popup when manually triggered
        completion = {
            documentation = {
                auto_show = true,
                auto_show_delay_ms = 500,
            },
            list = {
                cycle = {
                    from_top = true,
                    from_bottom = true,
                },
                selection = {
                    auto_insert = false,
                },
                auto_brackets = {
                    kind_resolution = {
                        blocked_filetypes = { "typescriptreact", "javascriptreact", "vue", "latex", "tex" },
                    },
                },
            },
            ghost_text = {
                enabled = true,
            },
        },

        -- Default list of enabled providers defined so that you can extend it
        -- elsewhere in your config, without redefining it, due to `opts_extend`
        sources = {
            default = { "lsp", "path", "snippets", "buffer" },
            providers = {
                snippets = {
                    override = {
                        get_trigger_characters = function(self)
                            if self.get_trigger_characters then
                                local stat, trigger_chars = pcall(self:get_trigger_characters())
                                if stat then
                                    vim.list_extend(trigger_chars, trigger_chars_add)
                                    return trigger_chars
                                else
                                    return trigger_chars_add
                                end
                            else
                                return trigger_chars_add
                            end
                        end,
                    },
                },
            },
        },

        snippets = {
            preset = "luasnip",
            opts = {
                clipboard_register = nil,
            },
        },

        -- (Default) Rust fuzzy matcher for typo resistance and significantly better performance
        -- You may use a lua implementation instead by using `implementation = "lua"` or fallback to the lua implementation,
        -- when the Rust fuzzy matcher is not available, by using `implementation = "prefer_rust"`
        --
        -- See the fuzzy documentation for more information
        fuzzy = { implementation = "prefer_rust_with_warning" },
    },
    opts_extend = { "sources.default" },
}
