import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
import greenhouse from "../../greenhouse.app.mjs";
import sampleEmit from "./test-event.mjs";
export default {
  key: "greenhouse-new-scheduled-interview",
  name: "New Scheduled Interview",
  description: "Emit new event when a new interview is scheduled within a specific time period.",
  version: "0.0.1",
  type: "source",
  dedupe: "unique",
  props: {
    greenhouse,
    db: "$.service.db",
    timer: {
      type: "$.interface.timer",
      default: {
        intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
      },
    },
    startsAfter: {
      type: "string",
      label: "Starts After",
      description: "Only return scheduled interviews scheduled to start at or after this timestamp. Timestamps must be in in [ISO-8601](https://developers.greenhouse.io/harvest.html#general-considerations) format.",
    },
    endsBefore: {
      type: "string",
      label: "Ends Before",
      description: "Only return scheduled interviews scheduled to end before this timestamp. Timestamps must be in in [ISO-8601](https://developers.greenhouse.io/harvest.html#general-considerations) format.",
    },
  },
  methods: {
    _getLastId() {
      return this.db.get("lastId") || 0;
    },
    _setLastId(id) {
      this.db.set("lastId", id);
    },
    generateMeta(interview) {
      return {
        id: interview.id,
        summary: `New Interview Scheduled: ${interview.id}`,
        ts: Date.parse(interview.updated_at),
      };
    },
    async startEvent(maxResults) {
      const lastId = this._getLastId();
      const response = this.greenhouse.paginate({
        fn: this.greenhouse.listInterviews,
        params: {
          starts_after: this.startsAfter,
          ends_before: this.endsBefore,
        },
        maxResults,
      });
      let responseArray = [];
      for await (const item of response) {
        responseArray.push(item);
      }
      responseArray.sort((a, b) => b.id - a.id);
      responseArray.filter((item) => item.id > lastId);
      if (responseArray.length) this._setLastId(responseArray[0].id);
      for (const item of responseArray.reverse()) {
        this.$emit(item, this.generateMeta(item));
      }
    },
  },
  hooks: {
    async deploy() {
      await this.startEvent(25);
    },
  },
  async run() {
    await this.startEvent();
  },
  sampleEmit,
};