{ config, pkgs, ... }:

let
  customPlugins = {
    mustang2 = pkgs.vimUtils.buildVimPlugin {
      name = "Mustang2";
      src = pkgs.fetchFromGitHub {
        owner = "croaker";
        repo = "mustang-vim";
        rev = "6533d7d21bf27cae94d9c2caa575f627f003dfd5";
        sha256 = "0zlmcrr04j3dkiivrhqi90f618lmnnnpvbz1b9msfs78cmgw9w67";
      };
    };
    unimpaired = pkgs.vimUtils.buildVimPlugin {
      name = "unimpaired-vim";
      src = pkgs.fetchFromGitHub {
        owner = "tpope";
        repo = "vim-unimpaired";
        rev = "11dc568dbfd7a56866a4354c737515769f08e9fe";
        sha256 = "1an941j5ckas8l3vkfhchdzjwcray16229rhv3a1d4pbxifwshi8";
      };
    };
    brogrammer = pkgs.vimUtils.buildVimPlugin {
      name = "brogrammer";
      src = pkgs.fetchFromGitHub {
        owner = "marciomazza";
        repo = "vim-brogrammer-theme";
        rev = "3e412d8e8909d8d89eb5a4cbe955b5bc0833a3c3";
        sha256 = "0am1qk8ls74z5ipgf9viacayq08y9i9vd7sxxiivwgsjh2ancbv6";
      };
    };
    file-line = pkgs.vimUtils.buildVimPlugin {
      name = "file-line";
      src = pkgs.fetchFromGitHub {
        owner = "bogado";
        repo = "file-line";
        rev = "f9ffa1879ad84ce4a386110446f395bc1795b72a";
        sha256 = "173n47w9zd01rcyrrmm194v79xq7d1ggzr19n1lsxrqfgr2c1rvk";
      };
    };
  };

in {

  environment.systemPackages = [
    (pkgs.vim_configurable.customize {
      name = "vim";

    vimrcConfig.customRC = ''
      set nocompatible
      set t_Co=16
      syntax on
      " TODO autoload colorscheme file
      set background=dark
      colorscheme brogrammer
      filetype off
      filetype plugin indent on

      imap <F1> <nop>

      set mouse=a
      set ruler
      set showmatch
      set backspace=2
      set visualbell
      set encoding=utf8
      set showcmd
      set wildmenu

      set title
      set titleold=
      set titlestring=%t%(\ %M%)%(\ (%{expand(\"%:p:h\")})%)%(\ %a%)\ -\ %{v:servername}

      set autoindent

      set ttyfast

      set pastetoggle=<INS>


      " Force Saving Files that Require Root Permission
      command! W silent w !sudo tee "%" >/dev/null

      nnoremap <C-c> :q<Return>
      vnoremap < <gv
      vnoremap > >gv

      nmap <esc>q :buffer


      "Tabwidth
      set ts=2 sts=2 sw=2 et

      " create Backup/tmp/undo dirs
      function! InitBackupDir()
        let l:parent = $HOME . '/.vim/'
        let l:backup = l:parent . 'backups/'
        let l:tmpdir = l:parent . 'tmp/'
        let l:undodi = l:parent . 'undo/'

        if !isdirectory(l:parent)
          call mkdir(l:parent)
        endif
        if !isdirectory(l:backup)
          call mkdir(l:backup)
        endif
        if !isdirectory(l:tmpdir)
          call mkdir(l:tmpdir)
        endif
        if !isdirectory(l:undodi)
          call mkdir(l:undodi)
        endif
      endfunction
      call InitBackupDir()

      " Backups & Files
      set backup
      set backupdir=~/.vim/backups
      set directory=~/.vim/tmp//
      set viminfo='20,<1000,s100,h,n~/.vim/tmp/info
      set undodir=$HOME/.vim/undo
      set undofile

      " highlight whitespaces
      highlight ExtraWhitespace ctermbg=red guibg=red
      match ExtraWhitespace /\s\+$/
      autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
      autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
      autocmd InsertLeave * match ExtraWhitespace /\s\+$/
      autocmd BufWinLeave * call clearmatches()

      "ft specific stuff
      autocmd BufRead *.js,*.json set ts=2 sts=2 sw=2 et
      autocmd BufRead *.hs set ts=4 sts=4 sw=4 et

      "esc timeout
      set timeoutlen=1000 ttimeoutlen=0

      "foldfunctions
      inoremap <F9> <C-O>za
      nnoremap <F9> za
      onoremap <F9> <C-C>za
      vnoremap <F9> zf
    '';

      vimrcConfig.vam.knownPlugins = pkgs.vimPlugins // customPlugins;
      vimrcConfig.vam.pluginDictionaries = [
        { names = [
          "brogrammer"
          "commentary"
          "extradite"
          "file-line"
          "fugitive"
          "Gundo"
          "mustang2"
          "unimpaired"
        ]; }
        { names = [ "vim-addon-nix" ]; ft_regex = "^nix\$"; }
      ];

    })
  ];
}