package de.assecutor.votianlt.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.YearMonth;

/**
 * Service für monatliche Scheduler-Aufgaben, die am letzten Tag des Monats (Ultimo) ausgeführt werden.
 */
@Service
public class MonthlySchedulerService {

    private static final Logger logger = LoggerFactory.getLogger(MonthlySchedulerService.class);

    /**
     * Scheduler, der täglich um 23:00 Uhr läuft und prüft, ob heute der letzte Tag des Monats ist.
     * Wenn ja, wird die monatliche Aufgabe ausgeführt.
     */
    @Scheduled(cron = "0 0 23 * * *") // Täglich um 23:00 Uhr
    public void checkAndRunMonthlyTask() {
        LocalDate today = LocalDate.now();
        LocalDate lastDayOfMonth = YearMonth.from(today).atEndOfMonth();

        if (today.equals(lastDayOfMonth)) {
            logger.info("Heute ist der letzte Tag des Monats ({}). Führe monatliche Aufgabe aus.", today);
            runMonthlyUltimoTask();
        } else {
            logger.debug("Heute ({}) ist nicht der letzte Tag des Monats. Nächster Ultimo: {}", 
                        today, lastDayOfMonth);
        }
    }

    /**
     * Alternative Implementierung: Direkter Cron-Ausdruck für den letzten Tag des Monats.
     * Dieser Scheduler läuft am letzten Tag jedes Monats um 23:00 Uhr.
     * 
     * Hinweis: Dieser Ansatz ist weniger flexibel, da er nicht alle Monate korrekt abdeckt.
     * Der obige Ansatz mit täglicher Prüfung ist robuster.
     */
    // @Scheduled(cron = "0 0 23 L * *") // Am letzten Tag des Monats um 23:00 Uhr
    public void runMonthlyUltimoTaskDirect() {
        logger.info("Monatliche Ultimo-Aufgabe wird direkt ausgeführt am: {}", LocalDate.now());
        runMonthlyUltimoTask();
    }

    /**
     * Die eigentliche monatliche Aufgabe, die am Ultimo ausgeführt wird.
     * Hier können Sie Ihre spezifische Geschäftslogik implementieren.
     */
    private void runMonthlyUltimoTask() {
        try {
            logger.info("=== MONATLICHE ULTIMO-AUFGABE GESTARTET ===");

            // TODO: Hier Ihre spezifische Geschäftslogik implementieren
            // Beispiele:
            // - Monatliche Berichte generieren
            // - Datenbereinigung durchführen
            // - Rechnungen erstellen
            // - Statistiken berechnen
            // - E-Mail-Benachrichtigungen versenden

            // Beispiel-Implementierung:
            generateMonthlyReports();
            cleanupOldData();
            sendMonthlyNotifications();

            logger.info("=== MONATLICHE ULTIMO-AUFGABE ERFOLGREICH ABGESCHLOSSEN ===");

        } catch (Exception e) {
            logger.error("Fehler bei der Ausführung der monatlichen Ultimo-Aufgabe", e);
            // Hier könnten Sie zusätzliche Fehlerbehandlung implementieren,
            // z.B. E-Mail-Benachrichtigung an Administratoren
        }
    }

    /**
     * Beispiel-Methode: Monatliche Berichte generieren
     */
    private void generateMonthlyReports() {
        logger.info("Generiere monatliche Berichte...");
        // TODO: Implementierung der Berichtsgenerierung
    }

    /**
     * Beispiel-Methode: Alte Daten bereinigen
     */
    private void cleanupOldData() {
        logger.info("Bereinige alte Daten...");
        // TODO: Implementierung der Datenbereinigung
    }

    /**
     * Beispiel-Methode: Monatliche Benachrichtigungen versenden
     */
    private void sendMonthlyNotifications() {
        logger.info("Versende monatliche Benachrichtigungen...");
        // TODO: Implementierung der Benachrichtigungen
    }

    /**
     * Hilfsmethode zum manuellen Auslösen der monatlichen Aufgabe (z.B. für Tests)
     */
    public void triggerMonthlyTaskManually() {
        logger.info("Monatliche Aufgabe wird manuell ausgelöst");
        runMonthlyUltimoTask();
    }
}