# cat /etc/nixos/configuration.nix
{ config, pkgs, ... }:

let nixos-unstable = import <nixos-unstable> {}; in
 
{
  boot.kernelPackages = pkgs.linuxPackages_latest;

  nixpkgs.overlays = [(self: super: {
    unstable = import <nixos-unstable>{};
  })];

  imports =
    [
      ./hardware-configuration.nix
      ./exwm-overlay.nix
    ];

  # Auto Updates
  system.autoUpgrade.enable = true;

  # Use the systemd-boot EFI boot loader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.timeout = 999999;
  boot.loader.efi.canTouchEfiVariables = true;

  # Set-up shared partition
  fileSystems."/mnt/shared" = {
    device = "/dev/disk/by-uuid/2AC4782EC477FB01";
    fsType = "ntfs";
    options = [ "users" "rw" "uid=1000" "gid=1000" ];
  };

  # ZFS customizations
  services.zfs.autoSnapshot.enable = true;
  services.zfs.autoScrub.enable = true;

  # Swap
  swapDevices = [
    { device = "/dev/sda7"; }
  ];

  # Select internationalisation properties.
  i18n = {
    consoleFont = "Lat2-Terminus16";
    consoleKeyMap = "us";
    defaultLocale = "en_US.UTF-8";
  };

  # Set-Up Networking Stuff
  networking.hostName = "LATITUDE-NIXOS";
  networking.networkmanager.enable = true;
  networking.hostId = "47c501b5";

  # Set your time zone.
  time.timeZone = "America/Los_Angeles";

  # Fonts
  fonts = {
    enableDefaultFonts = true;
    enableFontDir = true;
    enableGhostscriptFonts = true;
    fonts = with pkgs; [
      symbola
      noto-fonts
      noto-fonts-cjk
      noto-fonts-emoji
      nerdfonts
    ];
  };

  # No Suspending
  services.logind.lidSwitch = "ignore";

  # I'm fine with closed-source stuff
  nixpkgs.config.allowUnfree = true;

  # Packages
  environment.systemPackages = with pkgs; [
    acpi
    alsaUtils
    arandr
    aspell
    aspellDicts.en
    aspellDicts.en-computers
    aspellDicts.en-science
    binutils
    bluez
    bluez-tools
    cabal2nix
    citra
    coq
    direnv
    nixos-unstable.discord
    firefox-bin
    fzf
    gitAndTools.gitFull
    gnupg
    gnuplot
    haskellPackages.cabal-install
    haskellPackages.ghc
    haskellPackages.hlint
    haskellPackages.hoogle
    htop
    killall
    kpcli
    libreoffice
    ncurses.dev
    netcat
    nix-prefetch-git
    ntfs3g
    p7zip
    pandoc
    pango
    pavucontrol
    pciutils
    pianobar
    pinta
    qemu
    qutebrowser
    ripgrep
    sbcl
    scrot
    syslinux
    usbutils
    steam
#    steam-run
    sxiv
    tasksh
    taskwarrior
    texlive.combined.scheme-full
    unzip
    unrar
    virtmanager
    vlc
    wine
    wget
    wgetpaste
    xclip
    xorg.xbacklight
    xorg.xrandr
    xterm
  ];
  hardware.bluetooth.enable = true;
  hardware.opengl.driSupport32Bit = true;

  # Virtualization
  virtualisation.libvirtd.enable = true;

  # Printing
  services.printing.enable = true;
  services.printing.drivers = with pkgs; [
    gutenprint
    brgenml1cupswrapper
    brgenml1lpr
  ];

  # Shell Config
  programs.zsh = {
    enable = true;
    enableCompletion = true;
    interactiveShellInit = ''
      setopt correct
      bindkey -v'';
    ohMyZsh = {
      enable = true;
      plugins = [ "cabal" "git" "sudo" "systemd" "vi-mode" "wd" ];
      theme = "bureau";
    };
    shellAliases = {
      am = "alsamixer";
      xbl = "xbacklight";
      grep = "rg -S";
      tb = "nc termbin.com 9999";
      uninstall = "nix-env -q | fzf | xargs -I{} nix-env -e {}";
    };
  };
  users.defaultUserShell = pkgs.zsh;
  programs.command-not-found.enable = true;

  # Power Management
  services.acpid.enable = true;

  # Sound
  hardware.pulseaudio = {
    enable = true;
    package = pkgs.pulseaudioFull;
  };

  # Haskell
  services.hoogle.enable = true;
  services.hoogle.packages = hp: with hp; [ megaparsec parser-combinators recursion-schemes ];

  # Enable the X11 windowing system.
  services.xserver = {
    enable = true;
    layout = "us, gr";
    xkbOptions = "grp:shift_toggle, grp_led:caps, caps:escape, compose:menu";
    synaptics = {
      enable = true;
      vertEdgeScroll = true;
      vertTwoFingerScroll = true;
      scrollDelta = 111;
      tapButtons = true;
    };
    displayManager.lightdm = {
      enable = true;
    };
    desktopManager.xterm.enable = true;
    desktopManager.default = "none";
    windowManager = {
      default = "exwm";
      exwm = {
        enable = true;
        enableDefaultConfig = false;
      };
    };
  };

  # Define a user account.
  users.users = {
    avi = {
      isNormalUser = true;
      description = "Avi Caspe";
      group = "users";
      extraGroups = [ "networkmanager" "wheel" "audio" "systemd-journal" "libvirtd" ];
    };
  };

  # Enable Sudo
  security.sudo = {
    enable = true;
    wheelNeedsPassword = true;
  };

  # The NixOS release to be compatible with for stateful data such as databases.
  system.stateVersion = "17.09";
}