import drata from "../../drata.app.mjs";
import constants from "../../common/constants.mjs";
import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
const docsLink = "https://developers.drata.com/docs/openapi/reference/operation/PersonnelPublicController_listPersonnel/";
export default {
  key: "drata-new-personnel-added",
  name: "New Personnel Added",
  description: `Emit a new event for every new personnel. [See the documentation](${docsLink}).`,
  type: "source",
  version: "0.0.3",
  dedupe: "unique",
  props: {
    drata,
    db: "$.service.db",
    timer: {
      type: "$.interface.timer",
      default: {
        intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
      },
    },
    currentlyEmployed: {
      type: "boolean",
      label: "Currently Employed",
      description: "Only emit events for current employees",
      optional: true,
    },
    currentlyContracted: {
      type: "boolean",
      label: "Currently Contracted",
      description: "Only emit events for current contractors",
      optional: true,
    },
  },
  hooks: {
    async deploy() {
      const response = await this.drata.listPersonnel({
        paginate: true,
        params: {
          sort: constants.SORT_CRITERIA.START_DATE, 
          employmentStatuses: this.getEmploymentStatuses(),
        },
      });
      this._setVisitedIds(response.data.map((personnel) => personnel.id));
      const historical = this.sortByCreation(response.data)
        .slice(-constants.DEPLOY_LIMIT)
        .reverse();
      for (const personnel of historical) {
        this.$emit(personnel, {
          id: personnel.id,
          summary: `Historical personnel added event: ${this.drata.getPersonnelName(personnel)}`,
          ts: personnel.createdAt,
        });
      }
    },
  },
  methods: {
    _getVisitedIds() {
      return new Set(this.db.get("visitedIds"));
    },
    _setVisitedIds(visitedIds) {
      this.db.set("visitedIds", Array.from(visitedIds));
    },
    sortByCreation(list) {
      return list.sort((a, b) => new Date(a.createdAt) - new Date(b.createdAt));
    },
    getEmploymentStatuses() {
      if (!this.currentlyEmployed && !this.currentlyContracted) {
        return undefined;
      }
      const employmentStatuses = [];
      if (this.currentlyEmployed) {
        employmentStatuses.push("CURRENT_EMPLOYEE");
      }
      if (this.currentlyContracted) {
        employmentStatuses.push("CURRENT_CONTRACTOR");
      }
      return employmentStatuses;
    },
  },
  async run() {
    const visitedIds = this._getVisitedIds();
    const response = await this.drata.listPersonnel({
      paginate: true,
      params: {
        limit: constants.PAGINATION_LIMIT,
        sort: constants.SORT_CRITERIA.START_DATE,
        employmentStatuses: this.getEmploymentStatuses(),
      },
    });
    for (const personnel of this.sortByCreation(response.data)) {
      if (!visitedIds.has(personnel.id)) {
        visitedIds.add(personnel.id);
        this.$emit(personnel, {
          id: personnel.id,
          summary: `New personnel added: ${this.drata.getPersonnelName(personnel)}`,
          ts: personnel.createdAt,
        });
      }
    }
    this._setVisitedIds(visitedIds);
  },
};