package jobs

import (
	"context"
	"time"

	"veza-backend-api/internal/database"

	"go.uber.org/zap"
)

// CleanupExpiredPasswordResetTokens supprime les tokens de réinitialisation de mot de passe expirés et utilisés
// T0199: Supprime les tokens expirés (expires_at < NOW()) et les tokens utilisés plus anciens que 7 jours
func CleanupExpiredPasswordResetTokens(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 password_reset_tokens
		WHERE expires_at < $1 OR (used = TRUE AND created_at < $2)
	`, now, sevenDaysAgo)

	if err != nil {
		logger.Error("Failed to cleanup expired password reset 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 password reset tokens", zap.Int64("count", rowsAffected))
	}

	return nil
}

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

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