{ config, lib, pkgs, ... }:
let
  cfg = config.services.monetdb;
  monetdbUser = "monetdb";
in
with lib;
{

  ###### interface

  options = {

    services.monetdb = {

      enable = mkOption {
        type = types.bool;
        default = false;
        description = "Whether to enable MonetDB database server.";
      };

      package = mkOption {
        type = types.path;
        description = "MonetDB package to use.";
      };

      dbfarmDir = mkOption {
        type = types.path;
        default = "/var/lib/monetdb";
        description = ''
          Specifies location of Monetdb dbfarm (keeps database and auxiliary files).
        '';
      };

      port = mkOption {
        default = "50000";
        example = "50000";
        description = "Port to listen on.";
      };
    };

  };


  ###### implementation

  config = mkIf cfg.enable {

    users.extraUsers.monetdb = 
      { name = monetdbUser;
        uid = config.ids.uids.monetdb;
        description = "monetdb user";
        home = cfg.dbfarmDir;
      };

    users.extraGroups.monetdb.gid = config.ids.gids.monetdb;

    environment.systemPackages = [ cfg.package ];

    systemd.services.monetdb =
      { description = "MonetDB Server";

        wantedBy = [ "multi-user.target" ];

        after = [ "network.target" ];

        path = [ cfg.package ];

        preStart =
          ''
            # Initialise the database.
            if ! test -e ${cfg.dbfarmDir}/.merovingian_properties; then
                mkdir -m 0700 -p ${cfg.dbfarmDir}
                chown -R ${monetdbUser} ${cfg.dbfarmDir}
                ${cfg.package}/bin/monetdbd create ${cfg.dbfarmDir}
                ${cfg.package}/bin/monetdbd set port=${cfg.port} ${cfg.dbfarmDir}
            fi
          '';

        serviceConfig.ExecStart = "${cfg.package}/bin/monetdbd start -n ${cfg.dbfarmDir}";

        serviceConfig.ExecStop = "${cfg.package}/bin/monetdbd stop ${cfg.dbfarmDir}";

        unitConfig.RequiresMountsFor = "${cfg.dbfarmDir}";
      };

  };

}