package de.gessnerfl.fakesmtp.service;

import de.gessnerfl.fakesmtp.config.FakeSmtpConfigurationProperties;
import de.gessnerfl.fakesmtp.repository.EmailRepository;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(propagation = Propagation.REQUIRES_NEW)
public class EmailRetentionTimer {

    private final FakeSmtpConfigurationProperties fakeSmtpConfigurationProperties;
    private final EmailRepository emailRepository;
    private final Logger logger;

    @Autowired
    public EmailRetentionTimer(FakeSmtpConfigurationProperties fakeSmtpConfigurationProperties, EmailRepository emailRepository, Logger logger) {
        this.fakeSmtpConfigurationProperties = fakeSmtpConfigurationProperties;
        this.emailRepository = emailRepository;
        this.logger = logger;
    }

    @Scheduled(fixedDelay = 300000, initialDelay = 500)
    public void deleteOutdatedMails(){
        var persistence = fakeSmtpConfigurationProperties.getPersistence();
        if(isDataRetentionConfigured(persistence)){
            var maxNumber = persistence.getMaxNumberEmails();
            var count = emailRepository.deleteEmailsExceedingDateRetentionLimit(maxNumber);
            logger.info("Deleted {} emails which exceeded the maximum number {} of emails to be stored", count, maxNumber);
        }
    }

    private boolean isDataRetentionConfigured(FakeSmtpConfigurationProperties.Persistence persistence) {
        return persistence != null && persistence.getMaxNumberEmails() != null && persistence.getMaxNumberEmails() > 0;
    }

}