{ config, lib, pkgs, ... }:

with lib;

let
    cfg = config.services.elasticsearch-curator;
    curatorConfig = pkgs.writeTextFile {
      name = "config.yaml";
      text = ''
        ---
        # Remember, leave a key empty if there is no value.  None will be a string,
        # not a Python "NoneType"
        client:
          hosts: ${builtins.toJSON cfg.hosts}
          port: ${toString cfg.port}
          url_prefix:
          use_ssl: False
          certificate:
          client_cert:
          client_key:
          ssl_no_validate: False
          http_auth:
          timeout: 30
          master_only: False
        logging:
          loglevel: INFO
          logfile:
          logformat: default
          blacklist: ['elasticsearch', 'urllib3']
        '';
    };
    curatorAction = pkgs.writeTextFile {
      name = "action.yaml";
      text = cfg.actionYAML;
    };
in {

  options.services.elasticsearch-curator = {

    enable = mkEnableOption "elasticsearch curator";
    interval = mkOption {
      description = "The frequency to run curator, a systemd.time such as 'hourly'";
      default = "hourly";
      type = types.str;
    };
    hosts = mkOption {
      description = "a list of elasticsearch hosts to connect to";
      type = types.listOf types.str;
      default = ["localhost"];
    };
    port = mkOption {
      description = "the port that elasticsearch is listening on";
      type = types.port;
      default = 9200;
    };
    actionYAML = mkOption {
      description = "curator action.yaml file contents, alternatively use curator-cli which takes a simple action command";
      type = types.lines;
      example = ''
        ---
        actions:
          1:
            action: delete_indices
            description: >-
              Delete indices older than 45 days (based on index name), for logstash-
              prefixed indices. Ignore the error if the filter does not result in an
              actionable list of indices (ignore_empty_list) and exit cleanly.
            options:
              ignore_empty_list: True
              disable_action: False
            filters:
            - filtertype: pattern
              kind: prefix
              value: logstash-
            - filtertype: age
              source: name
              direction: older
              timestring: '%Y.%m.%d'
              unit: days
              unit_count: 45
      '';
    };
  };

  config = mkIf cfg.enable {
    systemd.services.elasticsearch-curator = {
      startAt = cfg.interval;
      serviceConfig = {
        ExecStart =
          "${pkgs.elasticsearch-curator}/bin/curator" +
          " --config ${curatorConfig} ${curatorAction}";
      };
    };
  };
}
