import db from "./db";
import api from "./Api";

const delayMillis = 3000; // 3 seconds
const intervalMillis = 300000; // 5 minutes

class Poller {
    constructor() {
        this.timer = null;
    }

    startWorker() {
        if (this.timer !== null) {
            return;
        }
        this.timer = setInterval(() => this.pollAll(), intervalMillis);
        setTimeout(() => this.pollAll(), delayMillis);
    }

    async pollAll() {
        console.log(`[Poller] Polling all subscriptions`);
        const subscriptions = await db.subscriptions.toArray();
        for (const s of subscriptions) {
            try {
                await this.poll(s);
            } catch (e) {
                console.log(`[Poller] Error polling ${s.id}`, e);
            }
        }
    }

    async poll(subscription) {
        console.log(`[Poller] Polling ${subscription.id}`);

        const since = subscription.last;
        const notifications = await api.poll(subscription.baseUrl, subscription.topic, since);
        if (!notifications || notifications.length === 0) {
            console.log(`[Poller] No new notifications found for ${subscription.id}`);
            return;
        }
        const notificationsWithSubscriptionId = notifications
            .map(notification => ({ ...notification, subscriptionId: subscription.id }));
        await db.notifications.bulkPut(notificationsWithSubscriptionId); // FIXME
        await db.subscriptions.update(subscription.id, {last: notifications.at(-1).id}); // FIXME
    };
}

const poller = new Poller();
export default poller;