{ lib, config, ... }:
  let
    inherit (lib)
      mkOption
      types
    ;

    cfg = config.valhalla;
  in {
    options = {
      valhalla = {
        software =
          let
            inherit (cfg.software)
              coding
              common
              desktopExperience
              school
              server
            ;
          in {
            essential = mkOption {
              type = types.bool;
              description = "A value indicating whether essentials should be installed.";
              default = true;
            };

            common = mkOption {
              type = types.bool;
              description = "A value indicating whether common software should be installed.";
              default = true;
            };

            server = mkOption {
              type = types.bool;
              description = "A value indicating whether server applications should be installed.";
              default = false;
            };

            desktopExperience = mkOption {
              type = types.bool;
              description = "A value indicating whether GUI apps should be installed.";
              default = common && !server;
            };

            fileSync = mkOption {
              type = types.bool;
              description = "A value indicating whether file syncs should be installed.";
              default = common && !server;
            };

            school = mkOption {
              type = types.bool;
              description = "A value indicating whether software for studies should be installed.";
              default = false;
            };

            productivity = mkOption {
              type = types.bool;
              description = "A value indicating whether productivity apps should be installed.";
              default = common || school;
            };

            socialMedia = mkOption {
              type = types.bool;
              description = "A value indicating whether social media apps should be installed.";
              default = common && desktopExperience;
            };

            media = mkOption {
              type = types.bool;
              description = "A value indicating whether media apps should be installed.";
              default = common && desktopExperience;
            };

            gaming = mkOption {
              type = types.bool;
              description = "A value indicating whether gaming apps should be installed.";
              default = common && desktopExperience;
            };

            coding = mkOption {
              type = types.bool;
              description = "A value indicating whether development apps should be installed.";
              default = common;
            };

            python = mkOption {
              type = types.bool;
              description = "A value indicating whether apps for coding python should be installed.";
              default = coding;
            };
          };
      };
    };
  }