import { Job } from "agenda";
import Models from "../api/models";
import { Op } from "sequelize";

export const updateUserPremiumStatusCron = async () => {
    console.log("Running update_user_premium_status cron job...");
    try {
        // Find all premium users
        const premiumUsers = await Models.UserSetting.findAll({
            where: { isPremium: true },
            attributes: ['userId']
        });

        const userIds = premiumUsers.map((u: any) => u.userId);

        if (userIds.length > 0) {
            // Find all users among these who HAVE an active subscription
            const activeSubscriptions = await Models.Subscription.findAll({
                where: {
                    userId: { [Op.in]: userIds },
                    status: 1,
                    [Op.or]: [
                        { currentPeriodEnd: { [Op.gt]: new Date() } },
                        { currentPeriodEnd: null }
                    ]
                },
                attributes: ['userId']
            });

            const activeUserIds = new Set(activeSubscriptions.map((s: any) => String(s.userId)));

            // Find users who are premium but DON'T have an active subscription
            const usersToDowngrade = userIds.filter((id: any) => !activeUserIds.has(String(id)));

            if (usersToDowngrade.length > 0) {
                await Models.UserSetting.update(
                    { isPremium: false },
                    { where: { userId: { [Op.in]: usersToDowngrade } } }
                );
                console.log(`Downgraded ${usersToDowngrade.length} users from premium.`);
            } else {
                console.log("update_user_premium_status cron: No premium users needed downgrading.");
            }
        } else {
            console.log("update_user_premium_status cron: No premium users found.");
        }
        console.log("update_user_premium_status cron job completed successfully.");
    } catch (error) {
        console.error("Error in update_user_premium_status cron:", error);
    }
};

export default (agenda: any) => {
    agenda.define("update_user_premium_status", async (job: Job) => {
        await updateUserPremiumStatusCron();
    });
};
