{ config, pkgs, lib, ... }:

{
  imports = [
    ./hardware-configuration.nix
    # TODO:
  ];

  # shacks-specific
  networking.wireless = {
    enable = true;
    networks.shack.psk = "181471eb97eb23f12c6871227bc4a7b13c8f6af56dcc0d0e8b71f4d7a510cb4e";
  };
  networking.hostName = "shackbook";

  boot.tmpOnTmpfs = true;

  users.users.shack = {
    createHome = true;
    useDefaultShell = true;
    home = "/home/shack";
    uid = 9001;
    packages = with pkgs;[
      chromium
      firefox
    ];
    extraGroups = [ "audio" "wheel"  ];
    hashedPassword = "$6$KIxlQTLEnKl7cwC$LrmbwZ64Mlm7zqUUZ0EObPJMES3C0mQ6Sw7ynTuXzUo7d9EWg/k5XCGkDHMFvL/Pz19Awcv0knHB1j3dHT6fh/" ;
  };

  environment.variables = let
    ca-bundle = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
  in {
    EDITOR = lib.mkForce "vim";
    CURL_CA_BUNDLE = ca-bundle;
    GIT_SSL_CAINFO = ca-bundle;
    SSL_CERT_FILE  = ca-bundle;
  };

  services.printing = {
    enable = true;
    # TODO: shack-printer
  };


  environment.systemPackages = with pkgs;[
    parted
    ddrescue
    tmux
    jq git gnumake htop rxvt_unicode.terminfo
    (pkgs.vim_configurable.customize {
      name = "vim";
      vimrcConfig.customRC = ''
      set nocompatible
      syntax on
      set list
      set listchars=tab:▸\ 
      "set list listchars=tab:>-,trail:.,extends:>

      filetype off
      filetype plugin indent on

      colorscheme darkblue
      set background=dark

      set number
      set relativenumber
      set mouse=a
      set ignorecase
      set incsearch
      set wildignore=*.o,*.obj,*.bak,*.exe,*.os
      set textwidth=79
      set shiftwidth=2
      set expandtab
      set softtabstop=2
      set shiftround
      set smarttab
      set tabstop=2
      set et
      set autoindent
      set backspace=indent,eol,start


      inoremap <F1> <ESC>
      nnoremap <F1> <ESC>
      vnoremap <F1> <ESC>

      nnoremap <F5> :UndotreeToggle<CR>
      set undodir  =~/.vim/undo
      set undofile
      "maximum number of changes that can be undone
      set undolevels=1000000
      "maximum number lines to save for undo on a buffer reload
      set undoreload=10000000

      nnoremap <F2> :set invpaste paste?<CR>
      set pastetoggle=<F2>
      set showmode

      set showmatch
      set matchtime=3
      set hlsearch

      autocmd ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red


      " save on focus lost
      au FocusLost * :wa

      autocmd BufRead *.json set filetype=json
      au  BufNewFile,BufRead *.mustache set syntax=mustache

      cnoremap SudoWrite w !sudo tee > /dev/null %

      " create Backup/tmp/undo dirs
      set backupdir=~/.vim/backup
      set directory=~/.vim/tmp

      function! InitBackupDir()
        let l:parent = $HOME    . '/.vim/'
        let l:backup = l:parent . 'backup/'
        let l:tmpdir = l:parent . 'tmp/'
        let l:undodir= 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:undodir)
          call mkdir(l:undodir)
        endif
      endfunction
      call InitBackupDir()

      augroup Binary
        " edit binaries in xxd-output, xxd is part of vim
        au!
        au BufReadPre  *.bin let &bin=1
        au BufReadPost *.bin if &bin | %!xxd
        au BufReadPost *.bin set ft=xxd | endif
        au BufWritePre *.bin if &bin | %!xxd -r
        au BufWritePre *.bin endif
        au BufWritePost *.bin if &bin | %!xxd
        au BufWritePost *.bin set nomod | endif
      augroup END
      '';
      vimrcConfig.vam.knownPlugins = pkgs.vimPlugins;
      vimrcConfig.vam.pluginDictionaries = [
        { names = [ "undotree" ]; }
        # vim-nix handles indentation better but does not perform sanity
        { names = [ "vim-addon-nix" ]; ft_regex = "^nix\$"; }
      ];
    })

  ];
  programs.bash = {
    enableCompletion = true;
    interactiveShellInit = ''
      HISTCONTROL='erasedups:ignorespace'
      HISTSIZE=900001
      HISTFILESIZE=$HISTSIZE
      shopt -s checkhash
      shopt -s histappend histreedit histverify
      shopt -s no_empty_cmd_completion
      PS1='\[\e[1;32m\]\w\[\e[0m\] '
    '';
  };

  services.journald.extraConfig = ''
    SystemMaxUse=1G
    RuntimeMaxUse=128M
  '';
  nix = {
    package = pkgs.nixUnstable;
    optimise.automatic = true;
    useSandbox = true;
    gc.automatic = true;
  };

  system.autoUpgrade.enable = true;

  boot.loader.grub.enable = true;
  boot.loader.grub.version = 2;
  boot.loader.grub.device = "/dev/sda";
  fileSystems."/".options = [ "noatime" "nodiratime" "discard" ];


  # gui and stuff
  i18n = {
    consoleFont = "Lat2-Terminus16";
    consoleKeyMap = "us";
    defaultLocale = "en_US.UTF-8";
  };

  fonts = {
    enableFontDir = true;
    enableGhostscriptFonts = true;
    fonts = [ pkgs.terminus_font ];
  };

  time.timeZone = "Europe/Berlin";
  services.timesyncd.enable = true;


  # GUI
  hardware.pulseaudio.enable = true;
  services.xserver = {
    enable = true;
    displayManager.auto.enable = true;
    displayManager.auto.user = "shack";

    desktopManager.xfce.enable = true;

    layout = "us";
    xkbVariant = "altgr-intl";
    xkbOptions = "ctrl:nocaps, eurosign:e";
  };

  services.openssh = {
    enable = true;
    hostKeys = [
      { bits = 8192; type = "ed25519"; path = "/etc/ssh/ssh_host_ed25519_key"; }
    ];
  };
}