import wordpress from "../../wordpress_com.app.mjs";
import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform";
export default {
  key: "wordpress_com-new-follower",
  name: "New Follower",
  description: "Emit new event for each new follower that subscribes to the site.",
  version: "0.0.2",
  type: "source",
  dedupe: "unique",
  methods: {
    getWordpressFollowers($) {
      return this.wordpress.getWordpressFollowers({
        $,
        site: this.site,
        type: this.type,
      });
    },
  },
  props: {
    wordpress,
    db: "$.service.db",
    site: {
      propDefinition: [
        wordpress,
        "siteId",
      ],
    },
    type: {
      type: "string",
      label: "Follower Type",
      description: "Select the type of followers to fetch: those who clicked Subscribe or those manually added in the dashboard.",
      options: [
        {
          label: "WordPress.com Followers",
          value: "wpcom",
        },
        {
          label: "Email-only Followers",
          value: "email",
        },
      ],
      default: "wpcom",
    },
    timer: {
      type: "$.interface.timer",
      label: "Timer",
      description: "How often to poll WordPress for new followers.",
      default: {
        intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
      },
    },
  },
  hooks: {
    async activate() {
      const {
        wordpress,
        db,
      } = this;
      await this.db.set("lastFollowerId", null); 
      const response = await this.getWordpressFollowers();
      const followers = response.subscribers || [];
      await wordpress.initialize(followers, db, "lastFollowerId");
    },
  },
  async run({ $ }) {
    const {
      wordpress,
      db,
    } = this;
    const response = await this.getWordpressFollowers($);
    const followers = response.subscribers || [];
    const lastFollowerId = Number(await db.get("lastFollowerId"));
    if (!lastFollowerId) await wordpress.initialize(followers, db, "lastFollowerId");
    let maxFollowerIdTracker = lastFollowerId;
    const newFollowers = [];
    for (const follower of followers) {
      if (Number(follower.ID) > lastFollowerId) {
        newFollowers.push(follower);
        if (Number(follower.ID) > maxFollowerIdTracker) {
          maxFollowerIdTracker = follower.ID;
        }
      }
    }
    for (const follower of newFollowers) {
      this.$emit(follower, {
        id: follower.ID,
        summary: follower.label || follower.login || "Anonymous Follower",
        ts: follower.date_subscribed && +new Date(follower.date_subscribed),
      });
    }
    
    if (newFollowers.length > 0) {
      await db.set("lastFollowerId", maxFollowerIdTracker);
      console.log(`Checked for new followers. Emitted ${newFollowers.length} follower(s).`);
    } else {
      console.log("No new followers found.");
    }
  },
};