{
  config,
  lib,
  ...
}:
with lib; let
  cfg = config.mailserver;
in {
  options.mailserver = {
    enable = mkEnableOption "mailserver";

    fqdn = mkOption {type = types.str;};

    domains = mkOption {type = types.listOf types.str;};

    ssl_config = mkOption {
      type = types.submodule {
        options = {
          useACME = mkOption {
            type = types.bool;
            default = true;
          };
          cert = mkOption {
            type = types.str;
            default = "/var/lib/acme/${cfg.fqdn}/fullchain.pem";
          };
          key = mkOption {
            type = types.str;
            default = "/var/lib/acme/${cfg.fqdn}/key.pem";
          };
        };
      };
      default = {};
    };

    debug_mode = mkOption {
      type = types.bool;
      default = false;
    };

    enable_roundcube = mkOption {
      type = types.bool;
      default = true;
    };

    roundcube_url = mkOption {
      type = types.str;
      default = "${cfg.fqdn}";
    };

    accounts = mkOption {
      # where name = email for login
      type = types.attrsOf (types.submodule ({name, ...}: {
        options = {
          name = mkOption {
            type = types.str;
            default = name;
          };
          passwordFile = mkOption {type = types.str;};
          aliases = mkOption {type = types.listOf types.str;};
          sieveScript = mkOption {type = types.nullOr types.lines;};
        };
      }));
    };

    extra_aliases_file = mkOption {
      type = types.nullOr types.str;
      default = null;
    };

    sieve_directory = mkOption {
      type = types.str;
      default = "/var/sieve";
    };

    dkim_directory = mkOption {
      type = types.str;
      default = "/var/dkim";
    };

    policyd_config = mkOption {
      type = types.lines;
      default = "";
    };

    extra_roundcube_config = mkOption {
      type = types.lines;
      default = "";
    };

    vmail_config = mkOption {
      type = types.submodule {
        options = {
          user = mkOption {
            type = types.str;
            default = "vmail";
          };
          group = mkOption {
            type = types.str;
            default = "${cfg.vmail_config.user}";
          };
          user_id = mkOption {
            type = types.number;
            default = 5000;
          };
          group_id = mkOption {
            type = types.number;
            default = cfg.vmail_config.user_id;
          };
          directory = mkOption {
            type = types.str;
            default = "/home/${cfg.vmail_config.user}";
          };
        };
      };
      default = {};
    };
  };
}