{ lib, ... }: let
  inherit (lib) mkOption mkEnableOption;
  inherit (lib.types) nullOr attrsOf str;
in {
  options = {
    conf = {
      # Generally client options
      apps.enable = mkEnableOption "Enable complete configuration for end-user machine.";
      niri.enable = mkEnableOption "Enable niri compositor.";
      vm.enable = mkEnableOption "Enable VM related configuration.";
      containers.enable = mkEnableOption "Enable container support.";
      games.enable = mkEnableOption "Enable games.";
      secureboot.enable = mkEnableOption "Enable secure boot utilities (manual key-enrolling required).";
      extraLayout.enable = mkEnableOption "Enable additional custom layout.";
      fonts.enable = mkEnableOption "Install and set preferred fonts";
      networkmanager.enable = mkEnableOption "Enable network manager and some related configuration";

      # Generally server options
      ssh.enable = mkEnableOption "Install my public key to allow accessing this machine via ssh.";
      nginx.enable = mkEnableOption "Enable nginx.";
      mail.enable = mkEnableOption "Enable mail server.";
      website.enable = mkEnableOption "Serve website through nginx. Nginx must be enabled to work correctly.";
      fedi.enable = mkEnableOption "Host a fedi server on this machine.";
      matrix.enable = mkEnableOption "Host a matrix server on this machine.";
      git.enable = mkEnableOption "Host a git server on this machine.";

      # Mixed and more complex options
      username = mkOption {
        type = str;
        description = "Username of the default user (single user setup).";
        default = "twoneis";
        example = "anna";
      };

      stateVersion = mkOption {
        type = nullOr str;
        description = "Nixos state version. Set to newest on first install and then don't change.";
        default = null;
        example = "24.05";
      };

      hmStateVersion = mkOption {
        type = nullOr str;
        description = "Home-Manager state version. Set to newest on first install and then don't change.";
        default = null;
        example = "24.11";
      };

      keys = mkOption {
        type = attrsOf str;
        description =- "Default key binds.";
        default = {
          up = "t";
          down = "n";
          left = "h";
          right = "s";
        };
        example = {
          up = "k";
          down = "j";
          left = "h";
          right = "l";
        };
      };
    };

    device = {
      disks = mkOption {
        type = attrsOf str;
        description = "A set of UUIDs of the partitions/lvms/... that can be used easily reused in the config. In this config boot and root are assumed to be always present.";
        default = { };
        example = {
          boot = "4672-C1A9";
          crypt = "747ae319-f189-44f5-9737-a42672e2c02d";
          root = "04255623-c061-4cf0-89fa-b3d8eb239d59";
        };
      };
    };

    theme = mkOption {
      type = attrsOf str;
      description = "Colors to be used for theming, the names and colors are from the rose-pine theme.";
      default = {
        base = "#191724";
        surface = "#1f1d2e";
        overlay = "#26233a";
        muted = "#6e6a86";
        subtle = "#908caa";
        text = "#e0def4";
        love = "#eb6f92";
        gold = "#f6c177";
        rose = "#ebbcba";
        pine = "#31748f";
        foam = "#9ccfd8";
        iris = "#c4a7e7";
        highlight-low = "#21202e";
        highlight-med = "#403d52";
        highlight-high = "#524f67";
      };
      example = {
        base = "#191724";
        surface = "#1f1d2e";
        overlay = "#26233a";
        muted = "#6e6a86";
        subtle = "#908caa";
        text = "#e0def4";
        love = "#eb6f92";
        gold = "#f6c177";
        rose = "#ebbcba";
        pine = "#31748f";
        foam = "#9ccfd8";
        iris = "#c4a7e7";
        highlight-low = "#21202e";
        highlight-med = "#403d52";
        highlight-high = "#524f67";
      };
    };
  };
}
