import skillzrun from "../../skillzrun.app.mjs";
import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
import constants from "../../common/constants.mjs";
import sampleEmit from "./test-event.mjs";
export default {
  key: "skillzrun-new-user-created",
  name: "New User Created",
  description: "Emit new event when a new user has been created in SkillzRun. [See the documentation](https://api.skillzrun.com/external/api/swagger/static/index.html#/users/get_external_api_users_)",
  version: "0.0.1",
  type: "source",
  dedupe: "unique",
  props: {
    skillzrun,
    db: "$.service.db",
    timer: {
      type: "$.interface.timer",
      default: {
        intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
      },
    },
  },
  hooks: {
    async deploy() {
      await this.processEvent(25);
    },
  },
  methods: {
    _getLastTs() {
      return this.db.get("lastTs") || 0;
    },
    _setLastTs(lastTs) {
      this.db.set("lastTs", lastTs);
    },
    emitEvent(user) {
      const meta = this.generateMeta(user);
      this.$emit(user, meta);
    },
    generateMeta(user) {
      return {
        id: user.id,
        summary: `New user created: ${user.name}`,
        ts: user.createdAt,
      };
    },
    async processEvent(max) {
      const lastTs = this._getLastTs();
      const limit = constants.DEFAULT_LIMIT;
      const params = {
        sort: "createdAt",
        order: "DESC",
        start: 0,
        end: limit,
      };
      let total, done, count = 0;
      const users = [];
      do {
        const { items } = await this.skillzrun.listUsers({
          params,
        });
        for (const user of items) {
          if (user.createdAt >= lastTs) {
            users.push(user);
            count++;
            if (max && count >= max) {
              done = true;
              break;
            }
          } else {
            done = true;
            break;
          }
        }
        total = items?.length;
        params.start += limit;
        params.end += limit;
      } while (total === limit && !done);
      this._setLastTs(users[0].createdAt);
      users.reverse().forEach((user) => this.emitEvent(user));
    },
  },
  async run() {
    await this.processEvent();
  },
  sampleEmit,
};