# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

# Nix Reference Manual:  
# https://nixos.org/manual/nix/stable/
# NixOS Packages / Options:
# https://search.nixos.org/packages?

# Other things to consider:
#   Telegraf 

{ lib, config, pkgs, ... }: {
  imports =
    [ 
      # Gnome configuration file.
      ./desktops/gnome.nix
      # Promtail logging
      ./software/promtail.nix
    ];

  # Keep the system up-to-date automatically
  system = {
    autoUpgrade = {
      enable = true;
      allowReboot = false;
      channel = https://channels.nixos.org/nixos-23.05;
    };
  };

  # Bootloader
  boot.loader.efi.canTouchEfiVariables = true;
  boot.tmp.cleanOnBoot = true;
  # Plymouth splash screen 
  boot.plymouth.enable = true;
  boot.initrd.systemd.enable = true;
  boot.kernelParams = ["quiet"];

  # SecureBoot
  boot.loader.systemd-boot.enable = lib.mkForce false;
  boot.lanzaboote.enable = true;
  boot.lanzaboote.pkiBundle = "/etc/secureboot";

  # Enable networking
  networking = {
    networkmanager = { 
      enable = true;
    };
    enableIPv6 = false;
    firewall = { 
      enable = true;
      allowedTCPPorts = [ 22 ];
      allowedUDPPorts = [  ];
    };
  };

  # Set your time zone.
  time.timeZone = "Asia/Tokyo";

  # Select internationalisation properties.
  i18n.defaultLocale = "en_US.UTF-8";

  i18n.extraLocaleSettings = {
    LC_ADDRESS = "en_US.UTF-8";
    LC_IDENTIFICATION = "en_US.UTF-8";
    LC_MEASUREMENT = "en_US.UTF-8";
    LC_MONETARY = "en_US.UTF-8";
    LC_NAME = "en_US.UTF-8";
    LC_NUMERIC = "en_US.UTF-8";
    LC_PAPER = "en_US.UTF-8";
    LC_TELEPHONE = "en_US.UTF-8";
    LC_TIME = "en_US.UTF-8";
  };

  # Configure keymap in X11
  services.xserver = {
    enable = true;
    layout = "us";
    xkbVariant = "";
    libinput = {
      enable = true;
      touchpad.tapping = true;
    };
    # Enable nVidia drivers
    videoDrivers = [ "nvidia" ];
    autorun = true;
  };

  # Enable sound with pipewire.
  sound.enable = true;
  hardware.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
  };

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.albert = {
    isNormalUser = true;
    description = "Albert J. Copeland";
    extraGroups = [ "networkmanager" "wheel" ];
    packages = with pkgs; [
      firefox
      bitwarden
      steam
      lutris
      vlc
      vscodium
    ];
  };

  # Allow unfree packages 
  nixpkgs.config.allowUnfree = true;

  # Enable flakes:  https://nixos.wiki/wiki/Flakes
  nix.settings.experimental-features = [ "nix-command" "flakes" ];

  # List packages installed in system profile. To search, run:
  environment.systemPackages = with pkgs; [
    # Secureboot
    sbctl

    # Bash powerline
    powerline-go

    # General packages
    # https://github.com/gvolpe/dconf2nix
    dconf2nix
    wget
    vim
    git
    curl
    htop
    iftop
    nload
    iotop
    glxinfo
    tailscale
    neofetch
  ];

  # Enable the OpenSSH daemon and Tailscale.
  services.openssh.enable = true;
  services.tailscale.enable = true;

  # Garbage collection -- Keep the system clean
  nix.gc = {
      automatic = true;
      dates = "weekly";
      options = "--delete-older-than 7d";
  };

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "23.05"; # Did you read the comment?
}