package com.saas.admin.service;

import com.saas.admin.repository.RefreshTokenRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.extern.slf4j.Slf4j;

import java.time.Instant;

@Service
@Slf4j
public class RefreshTokenCleanupService {

    @Autowired
    private RefreshTokenRepository refreshTokenRepository;

    /**
     * Scheduled job to delete expired refresh tokens every day at 2 AM (UTC).
     * Prevents the refresh_tokens table from growing indefinitely.
     * Runs: 0 0 2 * * * (every day at 02:00 UTC)
     */
    @Scheduled(cron = "0 0 2 * * *", zone = "UTC")
    @Transactional
    public void deleteExpiredTokens() {
        try {
            log.info("🧹 Starting cleanup of expired refresh tokens...");

            // Find all refresh tokens expired before now and delete them
            Instant now = Instant.now();
            int deletedCount = refreshTokenRepository.deleteExpiredTokens(now);

            log.info("✅ Cleanup completed. Deleted {} expired refresh tokens", deletedCount);
        } catch (Exception e) {
            log.error("❌ Error during refresh token cleanup: ", e);
            // Do NOT rethrow - allow scheduler to continue
        }
    }

    /**
     * Scheduled job to delete revoked refresh tokens older than 90 days.
     * Runs: 0 0 3 * * * (every day at 03:00 UTC)
     */
    @Scheduled(cron = "0 0 3 * * *", zone = "UTC")
    @Transactional
    public void deleteRevokedTokens() {
        try {
            log.info("🧹 Starting cleanup of old revoked refresh tokens...");

            // Delete revoked tokens older than 90 days
            Instant ninetyDaysAgo = Instant.now().minusSeconds(90L * 24 * 60 * 60);
            int deletedCount = refreshTokenRepository.deleteRevokedTokensBefore(ninetyDaysAgo);

            log.info("✅ Cleanup completed. Deleted {} old revoked refresh tokens", deletedCount);
        } catch (Exception e) {
            log.error("❌ Error during revoked token cleanup: ", e);
            // Do NOT rethrow - allow scheduler to continue
        }
    }
}
