import elmah_io from "../../elmah_io.app.mjs";
import constants from "../common/constants.mjs";
import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
const QUERY = "severity:Error OR severity:Fatal";
export default {
  name: "New Error",
  version: "0.0.4",
  key: "elmah_io-new-error",
  description: "Emit new event on each new error. [See the documentation](https://api.elmah.io/swagger/index.html#/Messages/Messages_GetAll)",
  type: "source",
  dedupe: "unique",
  props: {
    elmah_io,
    timer: {
      type: "$.interface.timer",
      default: {
        intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
      },
    },
    db: "$.service.db",
    logId: {
      propDefinition: [
        elmah_io,
        "logId",
      ],
    },
    alert: {
      type: "alert",
      alertType: "info",
      content: "Note: This source requires that your api key have the `logs_read` and `messages_read` permissions.",
    },
  },
  methods: {
    emitEvent(event) {
      this.$emit(event, {
        id: event.id,
        summary: `New error with ID ${event.id}`,
        ts: Date.parse(event.dateTime),
      });
    },
    _setLastEventDatetime(datetime) {
      this.db.set("lastEventDatetime", datetime);
    },
    _getLastEventDatetime() {
      return this.db.get("lastEventDatetime");
    },
  },
  hooks: {
    async deploy() {
      const messages = await this.elmah_io.getMessages({
        logId: this.logId,
        params: {
          pageSize: 10,
          query: QUERY,
        },
      });
      if (!messages.length) {
        return;
      }
      messages.forEach(this.emitEvent);
      this._setLastEventDatetime(messages[0].dateTime);
    },
  },
  async run() {
    let page = 0;
    const lastEventDatetime = this._getLastEventDatetime();
    while (page >= 0) {
      const messages = await this.elmah_io.getMessages({
        logId: this.logId,
        params: {
          pageIndex: page,
          pageSize: constants.DEFAULT_PAGE_SIZE,
          query: QUERY,
          from: lastEventDatetime
            ? lastEventDatetime
            : undefined,
        },
      });
      if (!messages.length) {
        return;
      }
      messages.forEach(this.emitEvent);
      this._setLastEventDatetime(messages[0].dateTime);
      page++;
      if (messages.length < constants.DEFAULT_PAGE_SIZE) {
        page = -1;
        return;
      }
    }
  },
};