{ config, pkgs, ...}: {
  # Desktop/Laptop configuration.nix
  # Import other files to this config:
  imports = [
    ./home-manager.nix
    ./variables.nix
  ];

  # Basic configs
  time.timeZone = ${timezone}

  # Boot settings 
  boot = {
    blacklistedKernelModules = [ "nouveau" ];
    cleanTmpDir = true;
  };

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

  # Networking:
  networking = {
    hostname = ${hostname};
    enableIPv6 = false;
    firewall = {
      enable = true;
      allowedTCPPorts = [ 22 ];
      allowedUDPPorts = [ 41641 ];
    };
    networkmanager = {
      enable = true;
    };
  };

  # Create a user:
  # https://nixos.org/manual/nixos/stable/index.html#sec-user-management
  users.users.${username} = {
    isNormalUser = false;
    initialPassword = "Password";
    description = "${user-full-name}";
    extraGroups = [ "wheel", "networkmanager" ];
    uid = 1000;
    shell = "/bin/bash"
  };

  # Enable various services:
  services = {
    openssh = {
      enable = true;
    };
    ntp = {
      enable = true;
    };
    tailscale = {
      enable = true;
      useRoutingFeatures = "server";
    };
    # X Display Manager
    # https://nixos.org/manual/nixos/stable/index.html#sec-x11 
    xserver = {
      enable = true;
      videoDrivers = nvidia;
      autorun = true;
      layout = "en";
      displayManager = {
        gdm = {
          enable = true;
        };
      };
      desktopManager = {
        gnome = {
          enable = true;
        };
      };
      # https://nixos.org/manual/nixos/stable/index.html#sec-gnome-enable
      # Adding icon themes:  https://nixos.org/manual/nixos/stable/index.html#sec-gnome-icons-and-gtk-themes
      gnome = {
        core-utilities.enable = false;
        games.enable = false;
      };
    };
    pipewire = {
      enable = true;
      alsa.enable = true;
      alsa.support32bit = true;
    };
  };

  # NixPkgs configuration
  nixpkgs = {
    system = "${system-arch}"
    config = {
      allowUnfree = true;
    };
  };

  # Install various packages
  environment = {
    systemPackages = with pkgs; [
      vim
      git
      curl
      htop
      tailscale
      iftop
      jq
      zip
      tar
      bash
    ];

    # If a GUI is enabled, install GUI apps:
    if config.services.xserver.enable then [
      pkgs.firefox
      pkgs.steam
      pkgs.bitwarden
      pkgs.lutris
      pkgs.vscodium
      pkgs.vlc
    ];
  };

  # Configure programs
  programs = {
    bash = {
      enableCompletion = true;
      enableLsColors = true;
      shellAliases = {
        d = "docker";
        dc = "docker-compose";
        de = "docker exec -it";
        ddate = "date +%Y.%m.%d";
        dday = "date +%A";
        g = "git";
        ga = "git add -A";
        gb = "git branch";
        gc = "git commit";
        gca = "git commit -a";
        gco = "git checkout";
        gd = "git diff";
        gl = "git pull --prune";
        gp = "git push origin HEAD";
        gs = "git status -sb";
        hs = "home-manager switch";
        ll = "ls -lah";
        rm = "rm -i";
        tdate = "date +%Y.%m.%d..%H.%M";
        ttime = "date +%H.%M";
      }
    };
    firefox = {
      # https://nixos.org/manual/nixos/stable/options.html#opt-programs.firefox.preferences
    }; 
    vim = {
      defaultEditor = true;
    };
    xwayland = {
      enable = true;
    };
    dconf = {
      enable = true;
    };
  };
}