{ pkgs, ... }:

let
  homedir = builtins.getEnv "HOME";
in
{
  home = {
    packages = import ./packages.nix { inherit pkgs; };
    sessionVariables = {
      EDITOR = "vim";
      LANG = "en_US.UTF-8";
      PATH = "${homedir}/bin:${homedir}/.cabal/bin:${homedir}/.local/bin:$PATH";
      PAGER = "less";
      LEDGER_FILE = "${homedir}/.hledger.journal";
    };
    keyboard.options = [ "caps:ctrl_modifier" ];
    file = {
      mutt = {
        text = (builtins.readFile ./muttrc) +
          (builtins.readFile ./mutt/solarized.muttrc);
        target = ".muttrc";
      };
      mailcap = {
        source = ./mailcap;
        target = ".mailcap";
      };
      tmux = {
        source = ./tmux;
        target = ".tmux.conf";
      };
      # use this because i override tls settings
      msmtprc = {
        source = ./msmtprc;
        target = ".msmtprc";
      };
    };
  };

  programs = {
    home-manager = {
      enable = true;
      path = "${homedir}/config/home-manager";
    };

    direnv = {
      enable = true;
    };

    vim = {
      enable = true;
      plugins = [
        "ctrlp"
        "fugitive"
        "editorconfig-vim"
        "gitgutter"
        "surround"
        "vim-colorschemes"
      ];
      extraConfig = builtins.readFile ./vimrc;
    };

    git = {
      enable = true;
      userName  = "Ben Sima";
      userEmail = "ben@bsima.me";
      ignores = [ "*~" "*.swp" ];
      package = pkgs.gitAndTools.gitFull;
      aliases = {
        authors = "shortlog -s -n";
      };
      extraConfig = ''
        [push]
        default = simple

        [commit]
        template = ~/.config/nixpkgs/git-commit-template

        [sendemail]
        smtpuser = ben@bsima.me
        smptserverport = 587
        smptserver = mail.bsima.me
        chainreplyto = false
        composeencoding = UTF-8
      '';
    };

    bash = {
      enable = true;
      initExtra = ''
        DIR=~/.nix-profile/etc/profile.d
        [[ -f "$DIR/nix.sh" ]] && . "$DIR/nix.sh"
        [[ -f "$DIR/hm-session-vars.sh" ]] && . "$DIR/hm-session-vars.sh"
        function cd() {
          builtin cd "$@" && ls
        }
      '';
      shellAliases = {
        #z = "fasd_cd -d"; # cd, same functionality as j in autojump
        #zz = "fasd_cd -d -i"; # cd with interactive selection
          a = "fasd -a"; # any
          add = "git add --ignore-removal";
          ci = "git commit";
          d = "fasd -d"; # directory
          day = "date +%a";
          ddate = "date +%Y.%m.%d";
          dday = "date +%A";
          et = "emacs -nw"; # emacs in a terminal
        f = "fasd -f"; # file
        fetch = "git fetch";
        g = "grep -in";
        ga = "git add -A";
        gb = "git branch";
        gc = "git commit";
        gca = "git commit -a";
        gco = "git checkout";
        gd = "git diff";
        gl = "git pull --prune";
        glog = ''git log --decorate --all --graph --pretty=format:"%Cred%h%Creset %an: %s - %Creset %C(yellow)%d%Creset %Cgreen(%cr)%Creset" --abbrev-commit --date=relative'';
        gp = "git push origin HEAD";
        gs = "git status -sb";
        hs = "home-manager switch";
        ll = "ls -l";
        pull = "git pull";
        push = "git push";
        rm = "rm -i";
        s = "fasd -si"; # show / search / select
        sd = "fasd -sid"; # interactive directory selection
        sf = "fasd -sif"; # interactive file selection
        showpath = "echo $PATH | sed 's/:/\n/g'";
        tdate = "date +%Y.%m.%d..%H.%M";
        ttime = "date +%H.%M";
        typeless = "history | tail -n 20000 | sed 's/.*  //' | sort | uniq -c | sort -g | tail -n 100";
        v = "vim";
        "v." = "vim .";
        vimdiff = "vim -d";
      };
    };

    emacs = {
      enable = true;
      extraPackages = epkgs: import ./emacs-packages.nix { inherit epkgs; };
    };
  };
}