{ pkgs
, lib
, config
, ... }: with lib; let
  cfg = config.global.fs.zfs.alert;

  backend = {
    text = pkgs.writeShellScript "telegram-text" ''
      set -e
      source ${cfg.secret}

      ${pkgs.curl}/bin/curl -sG \
        --data-urlencode "chat_id=$CHATID" \
        --data-urlencode "text=$ALERT" \
        $CURL_EXTRA_ARGS \
        "https://api.telegram.org/bot$APIKEY/sendMessage"
    '';
    image = pkgs.writeShellScript "telegram-image" ''
      set -e
      source ${cfg.secret}

      ${pkgs.curl}/bin/curl -sG \
        -F "chat_id=$CHATID" \
        -F "caption=$ALERT" \
        -F "photo=@-" \
        $CURL_EXTRA_ARGS \
        "https://api.telegram.org/bot$APIKEY/sendPhoto"
    '';
  };

  zedAlert = pkgs.writeShellScript "zed-alert" ''
    set -e
    export BODY="$(cat)"

    # add tag
    ALERT="$1 #zfs"

    export ALERT
    echo -e "$BODY" | \
    ${pkgs.imagemagick}/bin/convert \
      -size 1500x2000 xc:black \
      -font "${pkgs.freefont_ttf}/share/fonts/truetype/FreeMono.ttf" \
      -pointsize 16 \
      -fill white -annotate +15+80 "@-" \
      -trim -bordercolor "#000" \
      -border 32 +repage \
      png:- | \
    ${backend.image}
  '';

  mdadmAlert = pkgs.writeShellScript "mdadm-alert" ''
    set -e

    EVENT="$1"
    ARRAY="$2"
    DEVICE="$3"

    # fallback alert
    ALERT="$EVENT | $ARRAY | $DEVICE"

    case $EVENT in
      DegradedArray)
        ALERT="Array $ARRAY is in a degraded state"
        ;;
      DeviceDisappeared)
        ALERT="Array $ARRAY disappeared"
        ;;
      Fail)
        ALERT="Array $ARRAY encountered failure of component $DEVICE"
        ;;
      FailSpare)
        ALERT="Array $ARRAY encountered failure of spare component $DEVICE during rebuild"
        ;;
      MoveSpare)
        ALERT="Spare $DEVICE moved to array $ARRAY"
        ;;
      NewArray)
        ALERT="Array $ARRAY appeared"
        ;;
      Rebuild??)
        ALERT="Array $ARRAY rebuild is now $(echo $EVENT | ${pkgs.sedutil}/bin/sed 's/Rebuild//')% complete"
        ;;
      RebuildFinished)
        ALERT="Rebuild of array $ARRAY has concluded"
        ;;
      RebuildStarted)
        ALERT="Rebuild of array $ARRAY has started"
        ;;
      SpareActive)
        ALERT="Spare $DEVICE activated in array $ARRAY"
        ;;
      SparesMissing)
        ALERT="Array $ARRAY missing one or more spares"
        ;;
      TestMessage)
        ALERT="Test message generated for array $ARRAY"
        ;;
    esac

    # add tag
    ALERT="$ALERT #swraid"

    export ALERT
    exec ${backend.text}
  '';
in mkIf (cfg.secret != null) {
  services.zfs.zed = mkIf cfg.zed {
    settings = {
      ZED_EMAIL_ADDR = [ "root" ];
      ZED_EMAIL_PROG = toString zedAlert;
      ZED_EMAIL_OPTS = "'@SUBJECT@'";

      ZED_NOTIFY_INTERVAL_SECS = 3600;
      ZED_NOTIFY_VERBOSE = false;

      ZED_USE_ENCLOSURE_LEDS = true;
      ZED_SCRUB_AFTER_RESILVER = false;
    };
  };

  global.fs.zfs.split.mdProg = mkIf cfg.swraid (toString mdadmAlert);
}
