import ticketsauce from "../../ticketsauce.app.mjs";
import sampleEmit from "./test-event.mjs";
export default {
  key: "ticketsauce-new-event",
  name: "New Event",
  description: "Emit new event when an event is created in Ticketsauce. [See the documentation](https://speca.io/ticketsauce/ticketsauce-public-api?key=204000d6bda66da78315e721920f43aa#list-of-events)",
  version: "0.0.1",
  type: "source",
  dedupe: "unique",
  props: {
    ticketsauce,
    db: "$.service.db",
    alert: {
      type: "alert",
      alertType: "info",
      content: "The TicketSauce API caches responses to the **List of Events** endpoint for 1 hour. This affects how new events are polled. To avoid unnecessary API calls, set the polling interval accordingly. [See the documentation](https://speca.io/ticketsauce/ticketsauce-public-api?key=204000d6bda66da78315e721920f43aa#list-of-events)",
    },
    timer: {
      type: "$.interface.timer",
      default: {
        intervalSeconds: 60 * 60,
      },
    },
    partnerId: {
      propDefinition: [
        ticketsauce,
        "partnerId",
      ],
      description: "Filter events by a specific partner ID (optional)",
    },
    organizationId: {
      propDefinition: [
        ticketsauce,
        "organizationId",
      ],
      description: "Filter events by a specific organization ID (optional)",
    },
  },
  methods: {
    _getLastCreated() {
      return this.db.get("lastCreated") || "1970-01-01 00:00:00";
    },
    _setLastCreated(lastCreated) {
      this.db.set("lastCreated", lastCreated);
    },
    generateMeta(event) {
      return {
        id: event.Event.id,
        summary: `New Event: ${event.Event.name}`,
        ts: Date.parse(event.Event.created),
      };
    },
    async startEvent(maxResults = 0) {
      const lastCreated = this._getLastCreated();
      const events = await this.ticketsauce.listEvents(this, {
        partnerId: this.partnerId,
        organizationId: this.organizationId,
        params: {
          sort_by: "date",
          sort_dir: "desc",
          active_only: false,
        },
      });
      if (!events?.length) {
        return;
      }
      
      const newEvents = events.filter((event) =>
        Date.parse(event.Event.created) > Date.parse(lastCreated));
      
      newEvents.sort((a, b) =>
        Date.parse(a.Event.created) - Date.parse(b.Event.created));
      
      const eventsToEmit = maxResults && maxResults > 0
        ? newEvents.slice(0, maxResults)
        : newEvents;
      
      if (newEvents.length > 0) {
        
        const mostRecentEvent = events.reduce((latest, current) =>
          Date.parse(current.Event.created) > Date.parse(latest.Event.created)
            ? current
            : latest);
        this._setLastCreated(mostRecentEvent.Event.created);
      }
      
      for (const event of eventsToEmit) {
        this.$emit(event, this.generateMeta(event));
      }
    },
  },
  hooks: {
    async deploy() {
      await this.startEvent(25);
    },
  },
  async run() {
    await this.startEvent();
  },
  sampleEmit,
};