package dev.lions.unionflow.server.scheduler;

import dev.lions.unionflow.server.service.MemberLifecycleService;
import io.quarkus.scheduler.Scheduled;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.jboss.logging.Logger;

/**
 * Planificateur automatique pour le cycle de vie des membres.
 *
 * <p>Tâches exécutées périodiquement :
 * <ul>
 *   <li>Toutes les heures : rappels d'invitation expirant dans 24h</li>
 *   <li>Tous les jours à 02:00 : expiration des invitations périmées</li>
 * </ul>
 *
 * <p>Utilise le module {@code quarkus-scheduler} (déjà dans le pom.xml).
 * En production, les expressions cron peuvent être configurées via :
 * {@code unionflow.lifecycle.invitation.expiry.cron} dans application.properties.
 */
@ApplicationScoped
public class MemberLifecycleScheduler {

    private static final Logger LOG = Logger.getLogger(MemberLifecycleScheduler.class);

    @Inject
    MemberLifecycleService lifecycleService;

    /**
     * Envoie des rappels pour les invitations qui expirent dans les 24 prochaines heures.
     * Exécuté toutes les heures.
     */
    @Scheduled(cron = "${unionflow.lifecycle.reminder.cron:0 0 * * * ?}",
               identity = "membre-invitation-reminder")
    void rappelerInvitationsExpirantBientot() {
        try {
            int count = lifecycleService.envoyerRappelsInvitation();
            if (count > 0) {
                LOG.infof("[Scheduler] Rappels d'invitation envoyés : %d", count);
            }
        } catch (Exception e) {
            LOG.errorf(e, "[Scheduler] Erreur lors de l'envoi des rappels d'invitation");
        }
    }

    /**
     * Expire les invitations dont la date limite est dépassée.
     * Exécuté chaque nuit à 02:00.
     */
    @Scheduled(cron = "${unionflow.lifecycle.expiry.cron:0 0 2 * * ?}",
               identity = "membre-invitation-expiry")
    void expirerInvitations() {
        try {
            int count = lifecycleService.expirerInvitations();
            if (count > 0) {
                LOG.infof("[Scheduler] Invitations expirées traitées : %d", count);
            }
        } catch (Exception e) {
            LOG.errorf(e, "[Scheduler] Erreur lors de l'expiration des invitations");
        }
    }
}
