-- General Option
vim.opt.syntax = "off";
vim.g.mapleader = " "
vim.g.maplocalleader = " "

vim.opt.autoindent = true
vim.opt.background = 'dark'
vim.opt.backupdir = os.getenv("HOME") .. '/.local/tmp/nvim'
vim.opt.clipboard = 'unnamedplus'      --Use system clipboard
vim.opt.colorcolumn = '80'
vim.opt.directory = os.getenv("HOME") .. '/.local/tmp/nvim'
vim.opt.expandtab = true

-- Foldling code
-- Based on threesitter
vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"
vim.opt.foldcolumn = "0"
vim.opt.foldtext = ""
vim.opt.foldlevel = 99                -- I don't wand code to be fold by default
vim.opt.foldlevelstart = 1
vim.opt.foldnestmax = 2               -- max nested fold, 2 seems to be quite sufficient

vim.opt.gdefault = true 	            -- search: all occurrences by default
vim.opt.hlsearch = true 	            -- search: hightlight terms
vim.opt.ignorecase = true
vim.opt.incsearch = true
vim.opt.laststatus = 1

-- show special character
vim.opt.listchars = {
    tab = '→ ',
    trail = '␣',
    space = '·',
    eol = '',
    extends = '…',
    precedes = "<"
}

vim.opt.signcolumn = "yes"              -- alway show sign column
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.cursorline = true               -- highlight current line
vim.opt.showmatch = true
vim.opt.smartcase = true                -- search: try :to be smart about cases
vim.opt.smartindent = true
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
vim.opt.softtabstop = 2
vim.opt.wildmenu = true                 -- activate enhanced user menu
vim.opt.wildmode = 'lastused:full,list' -- enhance menu
vim.opt.pumheight = 10
vim.opt.pumwidth = 50
vim.opt.pumblend = 10

-- manage line break smartly
vim.opt.wrap = true
vim.opt.breakindent = true
vim.opt.linebreak = true
vim.opt.showbreak = string.rep(" ", 3)  -- Make it so that long lines wrap smartly

-- need to activate this for cmp
vim.opt.completeopt = {'menu', 'menuone', 'noselect'}
-- -- Code Fold
-- "Load and save view atomatocally (save and restore fold)
vim.cmd('au BufWinLeave *.* mkview')
vim.cmd('au BufWinEnter *.* silent! loadview')

-- local signs = { Error = "", Warn = "", Hint = "󰌶", Info = "" }
-- for type, icon in pairs(signs) do
--   local hl = "DiagnosticSign" .. type
--   vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = hl })
-- end

-- You will likely want to reduce updatetime which affects CursorHold
-- note: this setting is global and should be set only once
vim.o.updatetime = 250
-- vim.cmd [[autocmd! CursorHold,CursorHoldI * lua vim.diagnostic.open_float(nil, {scope='cursor', header = "", prefix = "", focus=false})]]

-- Autotype
vim.cmd('au BufRead,BufNewFile *.nix setlocal tabstop=2 shiftwidth=2 ')
vim.cmd('au BufNewFile,BufRead /tmp/neomutt* set tw=72 fo=awq comments+=nb:> noautoindent filetype=mail')

-- Ignore these filenames during enhanced command line completion.
vim.opt.wildignore = {
    '*.bak',
    '*.class',
    '*.aux',
    '*.out',
    '*.toc',
    '*.jpg',
    '*.bmp',
    '*.gif',
    '*.png',
    '*.luac',
    '*.o',
    '*.obj',
    '*.exe',
    '*.dll',
    '*.manifest',
    '*.pyc',
    '*.spl',
    '*.sw?'
}

--  Key biding
-- " ----------
local opts = { noremap = true, silent = true}

vim.api.nvim_set_keymap('n', '<leader>/', ':nohlsearch<CR>', opts)

-- Move tabs with \[ and \]
vim.api.nvim_set_keymap('n', '<Leader>]', ':tabnext<CR>', opts)
vim.api.nvim_set_keymap('n', '<Leader>[', ':tabprev<CR>', opts)
vim.api.nvim_set_keymap('n', '<leader>l', ':set list!<CR>', {silent = true})

-- disable lsplog
-- This is not usefull on a daily basis and should positively impact performance
vim.lsp.set_log_level("off")

-- define a timeout for match parens
vim.g.matchparen_timeout = 2
vim.g.matchparen_insert_timeout = 2

-- activate virtual lines for diagnistics
-- no more plugins needed
local x = vim.diagnostic.severity
vim.diagnostic.config({
  virtual_lines = true,
  -- Alternatively, customize specific options
  -- virtual_lines = {
  --  -- Only show virtual line diagnostics for the current cursor line
  --  current_line = true,
  -- },
  signs = { text = { [x.ERROR] = "󰅙", [x.WARN] = "", [x.INFO] = "󰋼", [x.HINT] = "󰌵" } },
})
