{ lib, config, ... }:
let
  inherit (lib) mkEnableOption mkDefault mkOption types;
  cfg = config.valhalla;

  mkUsersOption = programs: osConfig: mkOption {
    type = types.attrsOf (types.submodule (
      { ... }: {
        options = {
          inherit programs;
        };

        config = {
          programs = builtins.mapAttrs (
            name: config: {
              enable = mkDefault config.enable;
            }) osConfig.programs;
      };
    }));
  };

  mkPrograms = infos: builtins.foldl' (programs: info:
    programs // {
      ${builtins.elemAt info 0} = {
        enable = mkEnableOption (builtins.elemAt info 1);
      };
    }) { } infos;

  programs = mkPrograms [
    ["aliae" "aliae"]
    ["brave" "Brave Browser"]
    ["discord" "Discord"]
    ["firefox" "Firefox Web Browser"]
    ["openssh" "OpenSSH"]
    ["osu!lazer" "osu!lazer"]
    ["pennywise" "Pennywise"]
    ["powershell" "PowerShell Core"]
    ["retroarch" "RetroArch"]
    ["steam" "Steam"]
    ["thunderbird" "Thunderbird"]
    ["vscode" "Visual Studio Code"]
    ["zoxide" "zoxide"]
  ];

  linuxPrograms = mkPrograms [
    ["bash" "Bash"]
    ["fish" "fish"]
    ["icedtea" "IcedTea"]
    ["grub" "GRUB"]
    ["logo-ls" "logo-ls"]
    ["lutris" "Lutris"]
    ["minegrub-theme" "Minegrub Theme"]
    ["nginx" "nginx"]
    ["nodejs-n" "n"]
    ["nuke-usb" "nuke-usb"]
    ["nvidia-dkms" "Nvidia Drivers"]
    ["plasma" "Plasma"]
    ["pyenv" "pyenv"]
    ["sddm" "SDDM"]
    ["vim" "Vim"]
    ["virt-manager" "Virtual Machine Manager"]
    ["waydroid" "Waydroid"]
    ["xone" "xone"]
  ];

  windowsPrograms = mkPrograms [
    ["lghub" "Logitech G Hub"]
    ["maniaplanet" "ManiaPlanet"]
    ["msedge-redirect" "MSEdgeRedirect"]
    ["nvs" "Node Version Switcher"]
    ["osu!" "Osu!"]
    ["posh-git" "posh-git"]
    ["putty" "PuTTY"]
    ["rewasd" "reWASD"]
    ["terminal-icons" "Terminal Icons"]
    ["tm-nations-forever" "TrackMania Nations Forever"]
    ["tm-united-forever" "TrackMania United Forever"]
    ["tobii-gamehub" "Tobii Game Hub"]
    ["tobii-ghost" "Tobii Ghost"]
    ["ubiquiti-unifi-controller" "Ubiquiti UniFi Controller"]
    ["visualstudio" "Visual Studio"]
    ["winscp" "WinSCP"]
  ];
in {
  imports = [
    ./programs/docker.nix
    ./programs/git.nix
    ./programs/nextcloud.nix
    ./programs/oh-my-posh.nix
    ./programs/rclone.nix
  ];

  options = {
    valhalla = {
      users = mkUsersOption programs cfg;
      linux.users = mkUsersOption linuxPrograms cfg.linux;
      windows.users = mkUsersOption windowsPrograms cfg.windows;

      inherit programs;
      linux.programs = linuxPrograms;
      windows.programs = windowsPrograms;
    };
  };
}