import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
import moment from "moment";
import app from "../../new_york_times.app.mjs";
import sampleEmit from "./test-event.mjs";
export default {
  key: "new_york_times-new-article",
  name: "New Article Published",
  description: "Emit new event when an article is published.",
  version: "0.0.1",
  type: "source",
  dedupe: "unique",
  props: {
    app,
    db: "$.service.db",
    timer: {
      type: "$.interface.timer",
      default: {
        intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
      },
    },
    facet: {
      type: "boolean",
      label: "Facet",
      description: "Whether to show facet counts.",
      optional: true,
    },
    facetFields: {
      type: "string[]",
      label: "Facet Fields",
      description: "Use facets to view the relative importance of certain fields to a search term, and gain insight about how to best refine your queries and filter your search results.",
      options: [
        "day_of_week",
        "document_type",
        "ingredients",
        "news_desk",
        "pub_month",
        "pub_year",
        "section_name",
        "source",
        "subsection_name",
        "type_of_material",
      ],
      optional: true,
    },
    facetFilter: {
      type: "boolean",
      label: "Facet Filter",
      description: "Have facet counts use filters.",
      optional: true,
    },
    fl: {
      type: "string[]",
      label: "Field List",
      description: "The list of fields to return in the result set.",
      optional: true,
    },
    fq: {
      type: "string",
      label: "Filtered Query",
      description: "A query to filter the search results.",
      optional: true,
    },
    q: {
      type: "string",
      label: "Query",
      description: "Search query term. Search is performed on the article body, headline, and byline.",
      optional: true,
    },
    alert: {
      type: "alert",
      alertType: "info",
      content: "To learn more about filters you can download the [New York Times specification here](https://developer.nytimes.com/portals/api/sites/nyt-devportal/liveportal/apis/articlesearch-product/download_spec).",
    },
  },
  methods: {
    _getLastDate() {
      return this.db.get("lastDate") || moment().subtract(1, "day");
    },
    _setLastDate(created) {
      this.db.set("lastDate", created);
    },
    generateMeta(item) {
      return {
        id: item._id,
        summary: `A new article was just published with Id: ${item._id}.`,
        ts: item.pub_date,
      };
    },
    async startEvent(maxResults = 0) {
      const lastDate = this._getLastDate();
      const data = this.app.paginate({
        fn: this.app.searchArticles,
        maxResults,
        params: {
          begin_date: moment(lastDate).format("YYYYMMDD"),
          facet: this.facet,
          facet_fields: this.facetFields && this.facetFields.join(),
          facet_filter: this.facetFilter,
          fl: this.fl && this.fl.join(),
          fq: this.fq,
          q: this.q,
          sort: "newest",
        },
      });
      const responseArray = [];
      for await (const item of data) {
        if (Date.parse(item.pub_date) <= Date.parse(lastDate)) break;
        responseArray.push(item);
      }
      if (responseArray.length) this._setLastDate(responseArray[0].pub_date);
      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,
};