-- Load plugins
-- Bootstrap packer if needed {{
local fn = vim.fn
local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim'
if fn.empty(fn.glob(install_path)) > 0 then
   fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path})
   vim.cmd 'packadd packer.nvim'
end
-- }}

local use = require('packer').use

return require('packer').startup({function()
   -- TODO: Find a better way to organize this

   -- impatient (needs to go early)
   use {                                           -- lewis6991: impatient: Make nvim load faster by caching them
      'lewis6991/impatient.nvim',
      config = function()
         require('impatient')
      end,
   }

   -- Packer
   use {                                           -- packer
      'wbthomason/packer.nvim',
      config = function()
         -- Map :PS to :PackerSync
         vim.cmd 'command! PS PackerSync'
      end
   }

   -- Colors (decorations)
   use {                                           -- treesitter: syntax highlighting and more
      'nvim-treesitter/nvim-treesitter', run = ':TSUpdate',
      config = function()
         require('blake.lsp').treesitter()
      end,
   }
   use {                                           -- onedark theme
      'navarasu/onedark.nvim',
      config = function()
         -- vim.g.onedark_transparent_background = true
         vim.cmd [[
            "au ColorScheme onedark hi TabLine gui=none guibg='#282C34' guifg='#5C6370'  " all tabs color
            au ColorScheme onedark hi TabLineSel       guibg='#282C34' guifg='#B5BBC7'  " Highlighted tab color
            "au ColorScheme onedark hi TabLineFill      guibg='#282C34'                  " tabline portion without tabs (right-hand side)
            colorscheme onedark
         ]]
      end
   }
   use {                                           -- newspring: Good light theme for writing
      'NLKNguyen/papercolor-theme',
   }
   use {                                           -- statusline: lualine
      'nvim-lualine/lualine.nvim',
      requires = {'kyazdani42/nvim-web-devicons', opt = true},
      config = function()
         require('blake.other').lualine()
      end,
   }
   use {                                           -- nvim-tabline
      'seblj/nvim-tabline',
      requires = 'kyazdani42/nvim-web-devicons',
      config = function()
         require('tabline').setup {
            -- Disable icons (and clickable buttons)
            modified_icon = '',
            close_icon = '',
         }
      end
   }
   use {                                           -- css color tag highlighter (ex: #FFB13B)
      'norcalli/nvim-colorizer.lua',
      config = function()
         vim.cmd 'command! COL ColorizerToggle'
      end,
   }

   -- IDE features
   ---- LSP (document analysis)
   use {                                           -- lsp installer
      'williamboman/nvim-lsp-installer',
   }
   use {                                           -- Default LSP configs
      'neovim/nvim-lspconfig',
      before = 'williamboman/nvim-lsp-installer',
      config = function()
         require('blake.lsp').lspconfig()
      end
   }
   use {                                                       -- commentstring based on context from treesitter
      'JoosepAlviste/nvim-ts-context-commentstring',
      requires = 'nvim-treesitter/nvim-treesitter',
      config = function()
         require'nvim-treesitter.configs'.setup {
            context_commentstring = {
               enable = true,
               enable_autocmd = false,
            },
         }
      end,
   }
   use {                                           -- compe
      'hrsh7th/nvim-cmp',
      config = function()
         require('blake.lsp').cmp()
      end,
      requires = { -- (mostly) nvim-cmp sources (not required by cmp, but reqired by my configuration)
         'onsails/lspkind-nvim', -- icons for entries of the completion menu
         'hrsh7th/cmp-path',
         'hrsh7th/cmp-nvim-lua',
         'hrsh7th/cmp-nvim-lsp',
         'ray-x/cmp-treesitter',
         'hrsh7th/cmp-calc',
         'f3fora/cmp-spell',
         'hrsh7th/cmp-buffer',
         'hrsh7th/cmp-cmdline',
         'hrsh7th/cmp-emoji',
      },
   }
   use {                                           -- function parameter previews
      'ray-x/lsp_signature.nvim',
      after = 'nvim-lspconfig',
      config = function()
         require('blake.lsp').signature()
      end,
   }
   use {                                           -- symbols-outline: treesitter-based document outline (:SO)
      'simrat39/symbols-outline.nvim',
      config = function()
         vim.cmd 'command! SO SymbolsOutline'
      end,
   }
   use {                                           -- ALE: Support for lots of linters, etc
      'dense-analysis/ale',
      ft = {'sh', 'zsh', 'zshrc', 'bashrc', 'bash'},
      config = function()
         vim.g.ale_disable_lsp = 1
      end

   }
   ---- DAP (Debug Adapter Protocol)
   use {                                           -- nvim-dap: DAP support
      'mfussenegger/nvim-dap',
      config = function()
         require('blake.dap').nvim_dap()
      end
   }
   use {                                           -- DAP adapter installer
      'Pocco81/DAPInstall.nvim',
      config = function()
         require('blake.dap').dap_install()
      end
   }
   use {                                           -- virtual-text: Print Variable names while debugging
      'theHamsta/nvim-dap-virtual-text',
      config = function()
         require("nvim-dap-virtual-text").setup()
      end
   }
   use {                                           -- a UI for nvim-dap (easy access to info)
      'rcarriga/nvim-dap-ui',
      config = function()
         require('blake.dap').dap_ui()
      end,
   }

   ---- Other IDE features
   use {                                           -- git integration
      'lewis6991/gitsigns.nvim',
      requires = {
         'nvim-lua/plenary.nvim'
      },
      config = function()
         require('blake.other').gitsigns()
      end,
   }
   -- use {                                           -- file manager
   --    'kyazdani42/nvim-tree.lua',
   --    requires = 'kyazdani42/nvim-web-devicons',
   --    config = function()
   --       require('blake.other').nvimtree()
   --    end
   -- }
   use {                                           -- terminal
      'akinsho/toggleterm.nvim',
      config = function()
         require('blake.other').toggleterm()
      end
   }
   use {                                           -- Smooth Scrolling
      'karb94/neoscroll.nvim',
      config = function()
         require('blake.other').neoscroll()
      end,
   }
   use {                                           -- automatic session management
      'rmagatti/auto-session',
      config = function()
         require('blake.other').autosession()
      end
   }
   use {                                           -- Markdown preview
      'ellisonleao/glow.nvim',
      ft = { 'md', 'markdown', }
   }
   use {                                           -- Zen mode (:ZenMode or :ZM)
      "folke/zen-mode.nvim",
      config = function()
         require('blake.other').zenmode()
      end,
   }
   -- use {                                           -- dim text outside paragraph or function
   --    'folke/twilight.nvim',
   --    config = function()
   --       vim.cmd 'command! TW Twilight'
   --       require("twilight").setup()
   --    end,
   -- }
   use {                                           -- matchup: Use the percent (%) key for more things
      'andymass/vim-matchup',
   }
   -- use {                                           -- lightspeed: Jump around in files quickly
   --    'ggandor/lightspeed.nvim',
   -- }
   use {                                              -- indentline: Line indent indicators
      'lukas-reineke/indent-blankline.nvim',
      config = function()
         require('blake.other').indent_blankline()
      end
   }
   -- use {                                           -- targets.vim: fix ci' and other things to work right
   --    'wellle/targets.vim',
   -- }

   -- Conveniences
   use {                                           -- Ghost: Web browser integration
      'raghur/vim-ghost',
      opt = true,
      cmd = {'GhostStart', 'GhostInstall', 'GhostStop', 'GhostSync', 'GhostToggleSync',},
   }
   use {                                           -- Undo tree
      'mbbill/undotree',
      config = function()
         vim.cmd 'nnoremap <F5> <cmd>UndotreeToggle<CR>'
         vim.api.nvim_set_keymap('n', '<F5>', '<cmd>UndotreeToggle<CR>', { noremap = true, silent = true, })
      end
   }
  --  use {                                           -- Dim inactive window
  --    'sunjon/shade.nvim',
  --    config = function()
  --       require'shade'.setup({
  --          overlay_opacity = 50,
  --          opacity_step = 1,
  --          keys = {
  --             brightness_up    = '<C-Up>',
  --             brightness_down  = '<C-Down>',
  --             toggle           = '<Leader>s',
  --          }
  --       })
  --    end
  -- }
   use {                                           -- Quote pairing
      'windwp/nvim-autopairs',
      config = function()
         require('nvim-autopairs').setup()
      end
   }
   use {                                           -- accelerated jk movement
      'rhysd/accelerated-jk'
   }
   use {                                           -- cheat.sh integration
      'dbeniamine/cheat.sh-vim',
   }
   use {                                           -- nvim-align: Align text
      'RRethy/nvim-align'
   }
    use {                                            -- Comments (gb and gc)
       'numToStr/Comment.nvim',
       config = function()
          require('Comment').setup {
            pre_hook = function(ctx)
               -- Only calculate commentstring for tsx filetypes
               if vim.bo.filetype == 'typescriptreact' then
                  local U = require('Comment.utils')
                  -- Detemine whether to use linewise or blockwise commentstring
                  local type = ctx.ctype == U.ctype.line and '__default' or '__multiline'
                  -- Determine the location where to calculate commentstring from
                  local location = nil
                  if ctx.ctype == U.ctype.block then
                     location = require('ts_context_commentstring.utils').get_cursor_location()
                  elseif ctx.cmotion == U.cmotion.v or ctx.cmotion == U.cmotion.V then
                     location = require('ts_context_commentstring.utils').get_visual_start_location()
                  end
                  return require('ts_context_commentstring.internal').calculate_commentstring({
                     key = type,
                     location = location,
                  })
               end
            end,
          }
       end
    }
   use {                                              -- rhysd: committia: better commit editing window
      'rhysd/committia.vim',
   }
   use {                                              -- rhysd: conflict-marker: mark git conflicts - [x ]x
      'rhysd/conflict-marker.vim',
   }
   -- use {                                           -- lewis6991: spellsitter: Spell checking in treesitter files
   --    'lewis6991/spellsitter.nvim',
   --    config = function()
   --       require('spellsitter').setup()
   --    end,
   -- }
   use {                                           -- lewis6991: spaceless: Strip trailing whitespace as you are editing
      'lewis6991/spaceless.nvim',
      config = function()
         require'spaceless'.setup()
      end,
   }
   use {                                           -- lewis6991: foldsigns: Signs on folded lines
      'lewis6991/foldsigns.nvim',
      config = function()
         require('foldsigns').setup()
      end,
   }
   use {                                           -- tpope: surround
      'tpope/vim-surround'
   }
   use {                                           -- tpope: git integration
      'tpope/vim-fugitive'
   }
   use {                                           -- tpope: Repeatability for various tpope plugins
      'tpope/vim-repeat',
   }
   use {                                           -- tpope: automatically get info about files and apply it to vim (tabs vs spaces, etc)
      'tpope/vim-sleuth',
   }


   -- Bootstrap packer if needed {
   if (packer_bootstrap) then
      require('packer').sync()
   end -- }
end,
config = {
  display = { open_fn = require('packer.util').float },
  -- Move to lua dir so impatient.nvim can cache it
  compile_path = vim.fn.stdpath('config')..'/lua/packer_compiled.lua',
}})

-- vim:fdm=marker:fmr={,}:fdl=1:expandtab:tabstop=3:sw=3