{ lib, config, pkgs, ... }:
with lib;
let
  cfg = config.niveum.telegramBots;

  botService = name: bot: nameValuePair "telegram-bot-${name}" {
    enable = bot.enable;
    startAt = bot.time;
    serviceConfig.Type = "oneshot";
    wants = [ "network-online.target" ];
    script = strings.concatStringsSep "\n" (["QUOTE=$(${bot.command})"] ++ map (chatId: ''
      ${pkgs.curl}/bin/curl -s -X POST "https://api.telegram.org/bot${bot.token}/sendMessage" \
        -d chat_id="${chatId}" \
        -d text="$QUOTE" ${
          lib.strings.optionalString (bot.parseMode != null) "-d parse_mode=${bot.parseMode}"
        }
    '') bot.chatIds);
  };
in {
  options.niveum.telegramBots = mkOption {
    type = types.attrsOf (types.submodule {
      options = {
        enable = mkEnableOption "Telegram bot";
        time = mkOption { type = types.str; };
        token = mkOption { type = types.strMatching "[0-9A-Za-z:-]+"; };
        chatIds = mkOption { type = types.listOf (types.strMatching "[0-9]+|@[A-Za-z0-9]+"); };
        command = mkOption { type = types.str; };
        parseMode = mkOption {
          type = types.nullOr (types.enum ["HTML" "Markdown"]);
          default = null;
        };
      };
    });
    default = {};
  };

  config = {
    systemd.services = attrsets.mapAttrs' botService cfg;
  };
}
