# 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’).

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

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];


  nix = {
    nixPath = [
      "nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos"
      "nixos-config=/home/paul/NixOS/hosts/latitude/configuration.nix"
#      "/nix/var/nix/profiles/per-user/root/channels"
    ];
  };

  # System mounts
fileSystems."/mnt/nas/OldNas" = {
  device = "//192.168.1.194/OldNas";
  fsType = "cifs";
  options = [
    "noperm"
    "defaults"
    "users"
    "credentials=/home/paul/.smbcredentials"
    "uid=100"
    "noauto"
    "x-systemd.automount"
  ];
};

fileSystems."/mnt/nas/media" = {
  device = "//192.168.1.194/media";
  fsType = "cifs";
  options = [
    "noperm"
    "defaults"
    "users"
    "credentials=/home/paul/.smbcredentials"
    "uid=100"
    "noauto"
    "x-systemd.automount"
  ];
};

fileSystems."/mnt/nas/tvshows" = {
  device = "//192.168.1.194/TV-Shows";
  fsType = "cifs";
  options = [
    "noperm"
    "defaults"
    "users"
    "credentials=/home/paul/.smbcredentials"
    "uid=100"
    "noauto"
    "x-systemd.automount"
  ];
};

# UPDATE YOUR FUCKING ELECTRON APPS GUYS!!!

	nixpkgs.config.permittedInsecurePackages = [
		"electron"
 	];


  services.thermald.enable = lib.mkDefault true;


  # Enable AppImages
  boot.binfmt.registrations.appimage = {
    wrapInterpreterInShell = false;
    interpreter = "${pkgs.appimage-run}/bin/appimage-run";
    recognitionType = "magic";
    offset = 0;
    mask = ''\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff'';
    magicOrExtension = ''\x7fELF....AI\x02'';
  };

  # Bootloader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;
  boot.loader.systemd-boot.configurationLimit = 10; # Keep only the last 10 Generations.
  networking.hostName = "latitude"; # Define your hostname.

  # Enable networking
  networking.networkmanager.enable = true;

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

  # 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";
  };

  # Experimental Features Enabled
  	nix.settings.experimental-features = ["nix-command"];

  # Enable the X11 windowing system.
  services.xserver.enable = true;

  # Enable the KDE Plasma Desktop Environment.
  services.displayManager.sddm.wayland.enable = true;     # Launch KDE in Wayland session
  services.displayManager.defaultSession = "plasma";
  services.desktopManager.plasma6.enable = true;


  # Configure keymap in X11
  services.xserver.xkb = {
    layout = "us";
    variant = "";
  };

  # Enable CUPS to print documents.
  services.printing.enable = true;


  
  # Enable sound with pipewire.
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    # If you want to use JACK applications, uncomment this
    jack.enable = true;
  };

    # Bluetooth
  hardware.bluetooth = {
  	enable =true;
  	powerOnBoot = true;

  };
  ## Allow Bluetooth buttons to control media player
  systemd.user.services.mpris-proxy = {
      description = "Mpris proxy";
      after = [ "network.target" "sound.target" ];
      wantedBy = [ "default.target" ];
      serviceConfig.ExecStart = "${pkgs.bluez}/bin/mpris-proxy";
  };

  ## Enable extra blutooth codecs
    hardware.pulseaudio = {
    enable = false;
    package = pkgs.pulseaudioFull;
  };

 ## Enable Bluetooth A2DP Sink
   hardware.bluetooth.settings = {
    General = {
      Enable = "Source,Sink,Media,Socket";
	  Experimental = true;
    };
  };

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.paul = {
    isNormalUser = true;
    description = "Paul Hartman";
    extraGroups = [ "networkmanager" "wheel" "dialout"];
    packages = with pkgs; [
      firefox
      kate
    #  thunderbird
    ];
  };

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
  #  vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
	isoimagewriter
    appimage-run
    libsForQt5.kde-cli-tools
	libheif
	
	# WWAN Utilities
#	modem-manager-gui
	
	## CLI Utils
    wget
    curl
    micro
	gitFull
	speedtest-cli
	pciutils	
	fwupd
	htop
    aha
    clinfo
    virtualgl
    glxinfo
    vulkan-tools
    wayland-utils
    ncdu
    spotdl
    hugo
        	
    ## GUI programs
    firefox
    kate
	vscode-fhs
	yakuake
	bitwarden
	remmina
	virt-viewer
	chirp
	kdePackages.spacebar
	kdePackages.kontact
	kdePackages.kmail-account-wizard
	kdePackages.kleopatra
	gnupg
	#ungoogled-chromium
		
	# Chat/Internet
	#fluffychat
	discord
	chromium
	
	# Productivity
	bogofilter
#	claws-mail
	thunderbird
	libreoffice
	nextcloud-client
	kmymoney
    #logseq # Electron app, reinstall via flatpak
    #obsidian
    	
	## Audio/Music 
	audacity
	guitarix
#	musescore
	carla
#	k3b
	libation 
	sonixd
		
	## Video/Graphics
	gimp
	blender
	vlc
	obs-studio
		
    ## Games
    prismlauncher
    retroarchFull
    

	## Iphone Stuff

	libimobiledevice
	ifuse
  ];

  ## Docker
  virtualisation.docker.enable = true;


  # Flatpak bitches - CF 6-1-22

  services.flatpak.enable = true;
  xdg.portal.enable = true;

  ## Steam
  programs.steam = {
  enable = true;
  remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
  dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
};
  ## Allow unfree packages
  nixpkgs.config.allowUnfree = true;
  
  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  programs.mtr.enable = true;
  programs.gnupg.agent = {
    enable = true;
    enableSSHSupport = true;
  };

  # List services that you want to enable:
  services = {
	# Enable SSH
	openssh = {
		enable = true;
	};
	# Enable Tailscale
  	tailscale = {
  		enable = true;
  		# useRoutingFeatures = both;
  		extraUpFlags = [
  			"--ssh"
  			"--accept-routes"
  		];
  	};
  	# Enable iPhone Tethering
  	usbmuxd = {
  		enable = true;
  		package = pkgs.usbmuxd2;
  	};
  	
  }; 	
  # Enable KdeConnect
  programs.kdeconnect.enable = true; 
  
  # Open ports in the firewall.
  networking.firewall = { 
    enable = true;
    allowedTCPPortRanges = [ 
      { from = 1714; to = 1764; } # KDE Connect
    ];  
    allowedUDPPortRanges = [ 
      { from = 1714; to = 1764; } # KDE Connect
    ];  
  };  

  # Enable Automatic Upgrades
  system.autoUpgrade.enable = true;

  # Garbage Collection and Store Optimization
  nix.settings.auto-optimise-store = true;
  nix.gc = {
    automatic = true;
    interval = { Weekday = 0; Hour = 0; Minute = 0; };
    options = "--delete-older-than 30d";
  };

  # 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.11"; # Did you read the comment?

}