{ inputs, lib, ... }:
let
  userOpt = with lib; {
    username = mkOption { type = types.str; };
    wm = mkOption {
      type = types.enum [ "Wayland" "X11" "-" ];
      default = "-";
    };
    git = {
      username = mkOption { type = types.str; };
      email = mkOption { type = types.str; };
      key = mkOption { type = types.str; };
    };
  };
  netOpt = with lib; {
    ble = {
      enable = mkOption {
        type = types.bool;
        default = false;
      };
    };
    wlp = {
      enable = mkOption {
        type = types.bool;
        default = false;
      };
      nif = mkOption {
        type = types.str;
        default = "";
      };
    };
    wg = {
      enable = mkOption {
        type = types.bool;
        default = false;
      };
      ip4 = mkOption {
        type = types.str;
        default = "";
      };
      ip6 = mkOption {
        type = types.str;
        default = "";
      };
    };
  };
  makeOpt = with lib; {
    cli = mkOption {
      type = types.bool;
      default = true;
    };
    gui = mkOption {
      type = types.bool;
      default = false;
    };
    virt = mkOption {
      type = types.bool;
      default = true;
    };
    power = mkOption {
      type = types.bool;
      default = false;
    };
    game = mkOption {
      type = types.bool;
      default = false;
    };
    develop = mkOption {
      type = types.bool;
      default = false;
    };
  };
  serverOpt = with lib; {
    hostDomain = mkOption { type = types.str; };
    shortName = mkOption { type = types.str; };
    mailDomain = mkOption { type = types.str; };
    mailServer = mkOption { type = types.str; };

    dbHost = mkOption {
      type = types.str;
      default = "localhost";
    };
    dbPort = mkOption {
      type = types.str;
      default = "3306";
    };

    configPath = mkOption {
      type = types.str;
      default = "/media/config";
    };
    dataPath = mkOption {
      type = types.str;
      default = "/media/data";
    };

  };
in with lib; {
  options.usercfg = userOpt;
  options.syscfg = {
    hostname = mkOption { type = types.str; };
    type = mkOption {
      type = types.enum [ "nixos" "macos" "home" ];
      default = "nixos";
    };
    system = mkOption {
      type = types.enum [ "x86_64-linux" "x86_64-darwin" "-" ];
      default = "x86_64-linux";
    };
    defaultUser = mkOption { type = types.str; };
    make = makeOpt;
    net = netOpt;
    users = mkOption {
      type = types.listOf (types.submodule { options = userOpt; });
      default = [ ];
    };
    server = mkOption {
      type = types.oneOf [
        (types.attrs)
        (types.submodule { options = serverOpt; })
      ];
      default = { };
    };
  };
}