vim.g.mapleader = ' '
vim.g.maplocalleader = ';'
-- vim.g.python3_host_prog = '/usr/bin/python3'

vim.opt.mouse = 'a'    -- mouse does annoying things for me if it's not 'a'
vim.opt.signcolumn = 'yes'
vim.opt.clipboard = '' -- don't just use the system clipboard
vim.opt.wrap = false
vim.opt.breakindent = false
vim.opt.conceallevel = 2
vim.opt.concealcursor = 'c'
vim.opt.undofile = true
vim.opt.undolevels = 10000
vim.opt.writebackup = false
vim.opt.history = 5000
vim.opt.shada = { "'1000", '<50', 's10', 'h' }
vim.g.syntax = true
vim.o.exrc = true -- load local configs in plugin dir

-- Tabs and Indents
-- ===
vim.opt.textwidth = 80     -- Text width maximum chars before wrapping
vim.opt.tabstop = 4        -- The number of spaces a tab is
vim.opt.shiftwidth = 4     -- Number of spaces to use in auto(indent)
vim.opt.smarttab = true    -- Tab insert blanks according to 'shiftwidth'
vim.opt.autoindent = true  -- Use same indenting on new lines
vim.opt.smartindent = true -- Smart autoindenting on new lines
vim.opt.shiftround = true  -- Round indent to multiple of 'shiftwidth'

-- Timing
-- ===
vim.opt.ttimeout = true
vim.opt.timeoutlen = 500 -- Time out on mappings
vim.opt.ttimeoutlen = 10 -- Time out on key codes
vim.opt.updatetime = 250 -- Idle time to write swap and trigger CursorHold

-- Searching
-- ===
vim.opt.ignorecase = true -- Search ignoring case
vim.opt.smartcase = true  -- Keep case when searching with *
vim.opt.infercase = true  -- Adjust case in insert completion mode
vim.opt.incsearch = true  -- Incremental search
vim.opt.hlsearch = true   -- highlight searched stuff

-- Formatting
-- ===

vim.opt.wrap = false            -- No wrap by default
vim.opt.linebreak = true        -- Break long lines at 'breakat'
vim.opt.breakat = '\\ \\	;:,!?' -- Long lines break chars
vim.opt.startofline = false     -- Cursor in same column for few commands
vim.opt.splitbelow = true       -- Splits open bottom right
vim.opt.splitright = true
vim.opt.breakindentopt = { shift = 2, min = 20 }
vim.opt.formatoptions = 'trowcnlm1jp' -- see :h fo-table & :h formatoptions
vim.opt.breakindent = true

-- Diff
-- ===

vim.opt.diffopt:append { 'iwhite', 'indent-heuristic', 'algorithm:patience' }
vim.opt.wildmode = 'longest:full,full' -- Command-line completion mode

-- Folds
-- ===

vim.opt.foldlevelstart = 60
vim.opt.foldlevel = 60
vim.opt.foldminlines = 5

-- Editor UI
-- ===

vim.o.guifont = 'FiraCode Nerd Font:h15'
vim.opt.termguicolors = true
vim.opt.shortmess = 'xsTOInfFitloCaAs'
vim.opt.showmode = true        -- Show mode in cmd window
vim.opt.scrolloff = 6          -- Keep at least n lines above/below
vim.opt.sidescrolloff = 10     -- Keep at least n lines left/right
vim.opt.numberwidth = 2        -- Minimum number of columns to use for the line number
vim.opt.number = true          -- Show line numbers
vim.opt.relativenumber = false -- Show relative line numbers
vim.opt.ruler = true           -- Default status ruler
vim.opt.showtabline = 1        -- Don't change this, goes back to a vanilla vim default
vim.opt.laststatus = 3         -- Always show laststatus

-- Sets how neovim will display certain whitespace characters in the editor.
--  See `:help 'list'`
--  and `:help 'listchars'`
vim.opt.list = true
vim.opt.listchars = { tab = '» ', trail = '·', nbsp = '␣' }

if vim.g.started_by_firenvim == true then
  opt.showtabline = 1 -- Don't show tabline in firenvim, unless multitab
  opt.laststatus = 1  -- Don't show laststatus in firenvim
  opt.wrap = true
end

-- Preview substitutions live, as you type!
vim.opt.inccommand = 'split'

if vim.g.neovide == true then
  -- fulscreen with F11
  vim.api.nvim_set_keymap('n', '<F11>', ':let g:neovide_fullscreen = !g:neovide_fullscreen<CR>', {})

  vim.g.neovide_underline_automatic_scaling = true

  -- vim.g.neovide_floating_blur_amount_x = 2.0
  -- vim.g.neovide_floating_blur_amount_y = 2.0

  vim.g.neovide_scroll_animation_length = 0.1
  -- vim.g.neovide_cursor_animation_length = 0
  -- vim.g.neovide_cursor_trail_size = 0
  vim.g.neovide_hide_mouse_when_typing = true

  vim.g.neovide_fullscreen = true
end

vim.opt.helpheight = 0     -- Disable help window resizing
vim.opt.winwidth = 30      -- Minimum width for active window
vim.opt.winminwidth = 1    -- Minimum width for inactive windows
vim.opt.winheight = 1      -- Minimum height for active window
vim.opt.winminheight = 1   -- Minimum height for inactive window

vim.opt.showcmd = false    -- show command in status line
vim.opt.cmdheight = 0
vim.opt.cmdwinheight = 5   -- Command-line lines
vim.opt.equalalways = true -- Resize windows on split or close
vim.opt.colorcolumn = '80' -- Column highlight at textwidth's max character-limit

vim.opt.cursorline = true
vim.opt.cursorlineopt = { 'number', 'screenline' }

vim.opt.pumheight = 10 -- Maximum number of items to show in the popup menu
vim.opt.pumwidth = 10  -- Minimum width for the popup menu
vim.opt.pumblend = 10  -- Popup blend

-- Spelling correction
-- ===

vim.opt.spell = true -- manually enable spell with `set spell` or `<leader>ts`
vim.opt.spelllang = 'en,de_de'
vim.opt.spellsuggest = 'double,50,timeout:5000'

-- user commands
vim.api.nvim_create_user_command('Env', function(opts)
  vim.cmd(string.format('r!echo $%s', opts.fargs[1]))
end, { nargs = 1 })
vim.api.nvim_create_user_command('FormatDisable', function(args)
  if args.bang then
    -- FormatDisable! will disable formatting globally
    print 'disable autoformat globally'
    vim.g.disable_autoformat = true
  else
    print 'disable autoformat locally'
    vim.b.disable_autoformat = true
  end
end, {
  desc = 'Disable autoformat',
  bang = true,
})
vim.api.nvim_create_user_command('FormatEnable', function(args)
  if args.bang then
    -- FormatDisable! will enable formatting globally
    print 'enable autoformat globally'
    vim.g.disable_autoformat = false
  else
    print 'enable autoformat locally'
    vim.b.disable_autoformat = false
  end
end, {
  desc = 'Enable autoformat',
  bang = true,
})

-- autocommands
-- ===
local function augroup(name)
  return vim.api.nvim_create_augroup('plex_' .. name, {})
end

-- [[ Basic Keymaps ]]
--  See `:help vim.keymap.set()`

-- [[ Basic Autocommands ]]
--  See `:help lua-guide-autocommands`

-- Highlight when yanking (copying) text
--  Try it with `yap` in normal mode
--  See `:help vim.highlight.on_yank()`
vim.api.nvim_create_autocmd('TextYankPost', {
  desc = 'Highlight when yanking (copying) text',
  group = vim.api.nvim_create_augroup('kickstart-highlight-yank', { clear = true }),
  callback = function()
    vim.highlight.on_yank()
  end,
})

-- [[ Install `lazy.nvim` plugin manager ]]
--    See `:help lazy.nvim.txt` or https://github.com/folke/lazy.nvim for more info
local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim'
if not vim.loop.fs_stat(lazypath) then
  local lazyrepo = 'https://github.com/folke/lazy.nvim.git'
  vim.fn.system { 'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath }
end ---@diagnostic disable-next-line: undefined-field
vim.opt.rtp:prepend(lazypath)

require 'custom.maps'
require 'custom.autocmds'
require('lazy').setup({
  { import = 'custom.plugins' },
  { import = 'kickstart.plugins.debug' },
}, {
  ui = {
    -- If you are using a Nerd Font: set icons to an empty table which will use the
    -- default lazy.nvim defined Nerd Font icons, otherwise define a unicode icons table
    icons = vim.g.have_nerd_font and {} or {
      cmd = '⌘',
      config = '🛠',
      event = '📅',
      ft = '📂',
      init = '⚙',
      keys = '🗝',
      plugin = '🔌',
      runtime = '💻',
      require = '🌙',
      source = '📄',
      start = '🚀',
      task = '📌',
      lazy = '💤 ',
    },
  },
})

require 'kickstart.health'

-- The line beneath this is called `modeline`. See `:help modeline`
-- vim: ts=2 sts=2 sw=2 et
