package jobs

import (
	"context"
	"time"

	"veza-backend-api/internal/database"

	"go.uber.org/zap"
)

// CleanupExpiredVerificationTokens supprime les tokens de vérification expirés et utilisés
// T0189: Supprime les tokens expirés (expires_at < NOW()) et les tokens utilisés plus anciens que 7 jours
func CleanupExpiredVerificationTokens(db *database.Database, logger *zap.Logger) error {
	ctx := context.Background()
	now := time.Now()
	sevenDaysAgo := now.Add(-7 * 24 * time.Hour)

	// Delete expired tokens (expires_at < NOW()) and used tokens older than 7 days
	// Utilisation de paramètres pour compatibilité avec différentes bases de données
	result, err := db.ExecContext(ctx, `
		DELETE FROM email_verification_tokens
		WHERE expires_at < $1 OR (used = TRUE AND created_at < $2)
	`, now, sevenDaysAgo)

	if err != nil {
		logger.Error("Failed to cleanup expired verification tokens", zap.Error(err))
		return err
	}

	rowsAffected, err := result.RowsAffected()
	if err != nil {
		logger.Warn("Failed to get rows affected count", zap.Error(err))
	} else {
		logger.Info("Cleaned up verification tokens", zap.Int64("count", rowsAffected))
	}

	return nil
}

// ScheduleVerificationTokenCleanupJob programme le job de nettoyage des tokens de vérification pour s'exécuter quotidiennement
// T0189: Lance une goroutine qui exécute le nettoyage toutes les 24 heures
func ScheduleVerificationTokenCleanupJob(db *database.Database, logger *zap.Logger) {
	ticker := time.NewTicker(24 * time.Hour)
	go func() {
		// Exécuter immédiatement au démarrage
		if err := CleanupExpiredVerificationTokens(db, logger); err != nil {
			logger.Error("Initial cleanup job failed", zap.Error(err))
		}

		// Puis exécuter toutes les 24 heures
		for range ticker.C {
			if err := CleanupExpiredVerificationTokens(db, logger); err != nil {
				logger.Error("Scheduled cleanup job failed", zap.Error(err))
			}
		}
	}()
	logger.Info("Cleanup job scheduled to run daily")
}
