# 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, ... }:

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

  nix = {
    nixPath = [
      "nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos"
      "nixos-config=/home/paul/NixOS/hosts/legion/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"
    "guid=1000"
    "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=1000"
    "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=1000"
    "noauto"
    "x-systemd.automount"
  ];
};

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


#  boot.kernelPackages = pkgs.linuxKernel.packages.linux_6_6;
  boot.kernelModules = ["drivetemp"];
  # Enable experimental Feature
  nix.settings.experimental-features = ["nix-command" "flakes"];
  # Enable openGL
  hardware = {
	graphics = {
		enable = true;
		enable32Bit = true;
		extraPackages = [ pkgs.mesa.drivers ];
	};
  };

  # Load nvidia driver for Xorg and Wayland
  services.xserver.videoDrivers = ["nvidia"]; # or "nvidiaLegacy470 etc.
  hardware.nvidia-container-toolkit.enable = true;
  hardware.nvidia = {

    # Modesetting is required.
    modesetting.enable = true;

    # Nvidia power management. Experimental, and can cause sleep/suspend to fail.
    # Enable this if you have graphical corruption issues or application crashes after waking
    # up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead
    # of just the bare essentials.
    powerManagement.enable = true;

    # Fine-grained power management. Turns off GPU when not in use.
    # Experimental and only works on modern Nvidia GPUs (Turing or newer).
    powerManagement.finegrained = false;

    # Use the NVidia open source kernel module (not to be confused with the
    # independent third-party "nouveau" open source driver).
    # Support is limited to the Turing and later architectures. Full list of
    # supported GPUs is at:
    # https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus
    # Only available from driver 515.43.04+
    # Currently alpha-quality/buggy, so false is currently the recommended setting.
    open = false;

    # Enable the Nvidia settings menu,
	# accessible via `nvidia-settings`.
    nvidiaSettings = true;

    # Optionally, you may need to select the appropriate driver version for your specific GPU.
    #package = config.boot.kernelPackages.nvidiaPackages.stable;
	

  };

  # Bootloader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = 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'';
  };

  networking.hostName = "legion"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Enable networking
  networking.networkmanager.enable = true;

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

  # Select internationalisation properties.
  i18n.defaultLocale = "en_US.UTF-8";
  console = {
  	packages = [pkgs.terminus_font];
  	font = "${pkgs.terminus_font}/share/console/ter-i22b.psf.gz";
  	useXkbConfig =true;
  };

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


  # Enable Flatpaks
    services = {
    flatpak.enable = true;
    dbus.enable = true;
    picom.enable = true;
    };
    
  # Enable the X11 windowing system.
  services.xserver.enable = true;

  # Enable the KDE Plasma 5 Desktop Environment.
  #services.xserver.displayManager.sddm.wayland.enable  = true;
  #services.xserver.displayManager.defaultSession = "plasma";
  #services.desktopManager.plasma6.enable = true;
  # GNOME Desktop
#  services.desktopManager.gnome.enable = true;
#  services.gnome.games.enable = true;
#  services.gnome.core-developer-tools.enable = true;
  
  # Enable the Plasma 6 Desktop Enviroment
  # Enable the KDE Plasma Desktop Environment.
  services.displayManager.sddm.enable = true;
  services.displayManager.sddm.wayland.enable = true;
  #  services.xserver.desktopManager.plasma5.enable = true;
  services.desktopManager.plasma6.enable = true;
  programs.dconf.enable = true;
  programs.partition-manager.enable = true;
    # Enable PolKit
  security.polkit.enable = true;


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

  # Enable Bluetooth Services
  hardware.bluetooth.enable = true;
  hardware.bluetooth.powerOnBoot = true;
  hardware.bluetooth.settings = {
    General = {
      Enable = "Source,Sink,Media,Socket";
    };
  };       
  # Enable CUPS to print documents.
  services.printing.enable = 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;
    wireplumber.enable = true;
    # If you want to use JACK applications, uncomment this
    jack.enable = true;
    # use the example session manager (no others are packaged yet so this is enabled by default,
    # no need to redefine it in your config for now)
    #media-session.enable = true;
  };

  # Enable touchpad support (enabled default in most desktopManager).
  # services.xserver.libinput.enable = 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"
      "adbusers"
      "libvirtd"
      "video"
      "render"
      "audio"
    ];
    
    packages = with pkgs; [
	  chromium
      firefox
      kate
    #  thunderbird
    ];
  };

  fonts.packages = with pkgs; [
    noto-fonts
    ubuntu_font_family
    noto-fonts-emoji
    liberation_ttf
    fira-code
    fira-code-symbols
    mplus-outline-fonts.githubRelease
    dina-font
    fira
  ];

  # Enable Virtualization
  
  virtualisation.libvirtd.enable = true;
  programs.virt-manager.enable = true;
  
  # Flatpak bitches - CF 6-1-22

#  services.flatpak.enable = true;
  xdg.portal.enable = true;
  
  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
  };  

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


  # 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.
	## Printer Drivers
	cpuminer
#	electrum-ltc
	brlaser
	## CLI Utils
	tmux
    wget
    curl
    micro
	gitFull
	glxinfo
#	boinc
	boinctui
	htop		
	btop
#	cgminer
	#oraclejre
	temurin-jre-bin-17
	pciutils
#	fwupd
	ctop
	dig
	hddtemp
	iotop
#	lm-sensors
	smartmontools
	hugo
	ncdu
			
    ## GUI programs
    firefox
    kate
	vscode-fhs
	yakuake
	bitwarden
#	libsForQt5.kdeconnect-kde
	kdePackages.kdeconnect-kde
#	k3b
    libation

    remmina
    virt-viewer
	transmission_4-qt6
#	calibre	    
	chirp	#Currently failing build date=240827
#	litecoin
		
	# Chat/Internet
	#fluffychat
	discord
	
	# Productivity
	thunderbird
	libreoffice
	nextcloud-client
#	aichat

	# KDE STUFF
	kmymoney
	#kdePackages = {
	kcalc
	akonadi
	kdePackages.akonadiconsole
	kdePackages.akonadi-search
	kdePackages.kontact
	kdePackages.kontactinterface
	kdePackages.kaddressbook
	kdePackages.kdepim-addons
	kdePackages.kdepim-addons
	kdePackages.k3b
	#};
#	logseq
		
	## Audio/Music 
	audacity
	guitarix
	musescore
	carla
    #wireplumber
    calf
    sonixd

    ## CD Ripping
    rubyripper
	abcde
	sound-juicer
	whipper
    
	## Video/Graphics
	gimp
#	blender
	vlc
	obs-studio	
#	jellyfin-media-player
	
    ## Games
#    minecraft
    prismlauncher
    temurin-jre-bin
#	jdk21
	# znes2
#	nestopia-ue
#	kega-fusion
#	retroarchFull
	
	## Iphone Stuff
	libimobiledevice
	ifuse

	# Piper & Wyoming
	wyoming-piper
	piper-tts
  ];

  ## 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:
  programs.kdeconnect.enable = true;
#  programs.kdeconnect.package = pkgs.kdePackages.kdeconnect-kde;
  
  services = {

#	cgminer = {
#		enable = true;
#		pools = [ password = "21235365876986800"; url = "stratum+tcp://btc.f2pool.com:1314"; username = "consumer7918.001";]
#	hardware = {
#	    gpu-engine = "0-985";
#	    gpu-fan = "0-85";
#	    gpu-memclock = 860;
#	    gpu-powertune = 20;
#	    intensity = 9;
#	    temp-cutoff = 95;
#	    temp-overheat = 85;
#	    temp-target = 75;
#	};
#		config = {
#		  auto-fan = true;
#		  auto-gpu = true;
#		  expiry = 120;
#		  failover-only = true;
#		  gpu-threads = 2;
#		  log = 5;
#		  queue = 1;
#		  scan-time = 60;
#		  temp-histeresys = 3;
#		};
#	};
	# Firmware Updater?
	fwupd = {
		enable = true;
	};
	# Enable SSH
	openssh = {
		enable = true;
	};
	# Enable Tailscale
  	tailscale = {
  		enable = true;
  		# useRoutingFeatures = both;
  		extraUpFlags = [
  			"--ssh"
  			"--accept-routes"
  		];
  	};
  	#Enable LLM Services
  	ollama = {
      enable = true;
      acceleration = "cuda";
      openFirewall = true;
#      loadModels = [ "llama3.1:8b" ];
       loadModels = [ "DeepSeek-R1:8b" ];
      host = "100.84.238.20";
    };
  	# Enable iPhone Tethering
  	usbmuxd = {
  		enable = true;
  		package = pkgs.usbmuxd2;
  	};
	boinc.enable = true;	
	boinc.allowRemoteGuiRpc = true;
	boinc.extraEnvPackages = [pkgs.virtualbox pkgs.ocl-icd pkgs.linuxPackages.nvidia_x11 pkgs.libglvnd pkgs.brotli];
	boinc.dataDir = "/var/lib/boinc";
  }; 	

  ## Docker 
  virtualisation.docker.enable = true;
  virtualisation.docker.autoPrune.enable = true;
  virtualisation.docker.autoPrune.dates = "weekly";
  #virtualisation.docker.enableNvidia = true;
  virtualisation.docker.enableOnBoot = true;



  ## FIREWALL
  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
    # Or disable the firewall altogether.
  # networking.firewall.enable = false;
   networking.firewall = { 
    enable = false;
    allowedTCPPortRanges = [ 
      { from = 1714; to = 1764; } # KDE Connect
    ];  
    allowedUDPPortRanges = [ 
      { from = 1714; to = 1764; } # KDE Connect
    ];  
  };  
  
  # Enable Automatic Upgrades
  system.autoUpgrade = {
  	enable = true;
  	persistent = true;
  };

  # Garbage Collection and Store Optimization
  nix.settings.auto-optimise-store = true;
  nix.gc = {
    automatic = true;
    dates = "weekly";
    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?

}