{ lib, ... }:

with lib;

{
  options.machine = {
    pkgs = mkOption {
      type = types.listOf types.str;
      default = [ "base" ];
      description = ''
        The list of metapackages to be installed.
      '';
    };
    services = mkOption {
      type = types.listOf types.str;
      default = [];
      description = ''
        List of services to be enabled.
      '';
    };
    conffiles = mkOption {
      type = types.listOf types.str;
      default = [ "zsh" ];
      description = ''
        List of configuration files to be enabled.
      '';
    };
    hostName = mkOption {
      type = types.str;
      description = ''
        The Machines HostName
      '';
    };
    secretPath = mkOption {
      type = types.str;
      default = (findFirst (elem: elem.prefix == "secretPath") { path = "/secret"; } builtins.nixPath).path;
      description = ''
        Path to you systems secret folder containing files with sensitive information.
      '';
    };
    administrators = mkOption {
      type = types.listOf types.attrs;
      description = ''
        List of administrative users.
      '';
    };
    domain = mkOption {
      type = types.str;
      default = "localhost";
      description = ''
        The Machines domain name.
      '';
    };
    extraDomains = mkOption {
      type = types.listOf types.str;
      default = [];
      description = ''
        Extra domains used in various services.
      '';
    };
    mailAccounts = mkOption {
      type = types.listOf types.attrs;
      default = [];
      description = ''
        List of mail account user names.
      '';
    };
    vHosts = mkOption {
      type = types.listOf types.attrs;
      default = [];
      description = ''
        Domain - Service mappings for nginx vHost config.
      '';
    };
    desktop.wms = mkOption {
      type = types.listOf types.str;
      default = [];
      description = ''
        The list of wms to be enabled.
      '';
    };
  };
  imports = [
    (mkAliasOptionModule [ "machine" "firewall" ] [ "networking" "firewall" ])
    (mkAliasOptionModule [ "machine" "allowUnfree" ] [ "nixpkgs" "config" "allowUnfree" ])
  ];
}