package de.gecheckt.pdf.umbenenner.adapter.in.gui;

import java.util.Objects;
import java.util.Optional;

import de.gecheckt.pdf.umbenenner.application.port.in.SchedulerControlUseCase;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.util.Duration;

/**
 * Zentrale Status-Refresh-Timeline für die GUI.
 * <p>
 * Startet eine JavaFX-{@link Timeline}, die im Sekundentakt einen Callback aufruft.
 * Der Callback liest den aktuellen Scheduler-Status und aktualisiert alle betroffenen
 * Tabs (Batch-Tab, Konfig-Tab, Scheduler-Tab) auf dem JavaFX Application Thread.
 * <p>
 * Die Timeline wird beim Aufbau der Haupt-GUI gestartet und beim Beenden der
 * Anwendung gestoppt. Sie läuft unabhängig davon, welcher Tab gerade sichtbar ist.
 * <p>
 * Wenn kein {@link SchedulerControlUseCase} vorhanden ist, wird der Callback trotzdem
 * aufgerufen – der Aufrufer entscheidet, wie er das leere Optional behandelt.
 */
public final class GuiStatusRefreshTimeline {

    private final Timeline timeline;

    /**
     * Erzeugt eine neue Status-Refresh-Timeline.
     * <p>
     * Die Timeline ist nach der Konstruktion noch nicht aktiv; {@link #start()} muss
     * explizit aufgerufen werden.
     *
     * @param schedulerControlUseCase optionaler Scheduler-Control-Use-Case;
     *                                 {@code null} wird als leer behandelt
     * @param onRefresh               Callback der bei jedem Tick auf dem JavaFX Application
     *                                 Thread aufgerufen wird; darf nicht {@code null} sein
     */
    public GuiStatusRefreshTimeline(
            Optional<SchedulerControlUseCase> schedulerControlUseCase,
            Runnable onRefresh) {
        Objects.requireNonNull(onRefresh, "onRefresh must not be null");
        this.timeline = new Timeline(
                new KeyFrame(Duration.seconds(1), e -> onRefresh.run()));
        this.timeline.setCycleCount(Animation.INDEFINITE);
    }

    /**
     * Startet die Status-Refresh-Timeline.
     * <p>
     * Muss auf dem JavaFX Application Thread aufgerufen werden.
     * Mehrfache Aufrufe sind unschädlich.
     */
    public void start() {
        timeline.play();
    }

    /**
     * Stoppt die Status-Refresh-Timeline.
     * <p>
     * Muss auf dem JavaFX Application Thread aufgerufen werden.
     * Mehrfache Aufrufe sind unschädlich.
     */
    public void stop() {
        timeline.stop();
    }
}
