package de.gecheckt.pdf.umbenenner.application.port.in;

/**
 * Zustandsautomat des automatischen Schedulers.
 * <p>
 * Beschreibt den aktuellen Lebenszykluszustand des Schedulers und
 * steuert, welche Aktionen (Starten, Stoppen, manuelle Läufe)
 * in der GUI erlaubt sind.
 */
public enum SchedulerState {

    /**
     * Scheduler ist gestoppt.
     * <p>
     * Manuelle Läufe sind erlaubt. Der Scheduler-Start-Button ist
     * aktiv, sofern weitere Voraussetzungen erfüllt sind.
     */
    STOPPED,

    /**
     * Scheduler befindet sich im Startvorgang.
     * <p>
     * Lock-Erwerb und initiale Einrichtung laufen. Manuelle Starts
     * sind in diesem Übergangszustand deterministisch gesperrt.
     */
    STARTING,

    /**
     * Scheduler läuft und wartet auf den nächsten Tick.
     * <p>
     * Kein Batch läuft gerade. Der Countdown bis zum nächsten Tick
     * ist sichtbar. Manuelle Läufe sind gesperrt.
     */
    RUNNING_IDLE,

    /**
     * Scheduler läuft und ein Tick verarbeitet gerade einen Batch.
     * <p>
     * Manuelle Läufe sind gesperrt. Der Stop-Button bleibt aktiv,
     * bricht den laufenden Batch jedoch nicht ab.
     */
    RUNNING_BATCH_ACTIVE,

    /**
     * Stopp wurde angefordert, aber der laufende Batch läuft noch zu Ende.
     * <p>
     * Nach Abschluss des Batches wechselt der Zustand zu {@link #STOPPED}.
     * Der Status-Indikator zeigt „Gestoppt – aktueller Lauf läuft noch".
     */
    STOPPING_BATCH_ACTIVE;

    /**
     * Prüft, ob der Scheduler in diesem Zustand als aktiv gilt.
     * <p>
     * Als aktiv gelten alle Zustände außer {@link #STOPPED}.
     *
     * @return {@code true}, wenn der Scheduler nicht gestoppt ist
     */
    public boolean isActive() {
        return this != STOPPED;
    }

    /**
     * Prüft, ob in diesem Zustand ein Batch verarbeitet wird.
     *
     * @return {@code true} bei {@link #RUNNING_BATCH_ACTIVE} oder
     *         {@link #STOPPING_BATCH_ACTIVE}
     */
    public boolean isBatchRunning() {
        return this == RUNNING_BATCH_ACTIVE || this == STOPPING_BATCH_ACTIVE;
    }
}
