package de.gecheckt.pdf.umbenenner.application.port.out.history;

import java.time.Instant;
import java.util.Objects;

import de.gecheckt.pdf.umbenenner.domain.model.DocumentFingerprint;
import de.gecheckt.pdf.umbenenner.domain.model.ProcessingStatus;

/**
 * Einzelzeile der Dokumentenliste im Historien-Tab.
 * <p>
 * Enthält alle Felder, die für die linke Tabelle des Historien-Tabs benötigt werden.
 * Die Felder stammen aus {@code document_record} und einem {@code COUNT}-Ausdruck über
 * {@code processing_attempt}.
 *
 * @param fingerprint          Inhalts-basierter Dokumentbezeichner; nie {@code null}
 * @param overallStatus        aktueller Gesamtstatus des Dokuments; nie {@code null}
 * @param sourceFileName       zuletzt bekannter Quelldateiname; nie {@code null}
 * @param targetFileName       zuletzt bekannter Zieldateiname; {@code null} falls noch kein
 *                             erfolgreicher Lauf stattgefunden hat
 * @param sourcePath           zuletzt bekannter Quellpfad (opaker Locator-Wert); nie {@code null}
 * @param updatedAt            Zeitpunkt der letzten Aktualisierung des Stammsatzes; nie {@code null}
 * @param attemptCount         Anzahl historisierter Verarbeitungsversuche; immer &gt;= 0
 */
public record DocumentHistoryRow(
        DocumentFingerprint fingerprint,
        ProcessingStatus overallStatus,
        String sourceFileName,
        String targetFileName,
        String sourcePath,
        Instant updatedAt,
        long attemptCount) {

    /**
     * Kompakter Konstruktor mit Pflichtfeldprüfung.
     *
     * @throws NullPointerException     wenn ein Pflichtfeld {@code null} ist
     * @throws IllegalArgumentException wenn {@code attemptCount} negativ ist
     */
    public DocumentHistoryRow {
        Objects.requireNonNull(fingerprint, "fingerprint darf nicht null sein");
        Objects.requireNonNull(overallStatus, "overallStatus darf nicht null sein");
        Objects.requireNonNull(sourceFileName, "sourceFileName darf nicht null sein");
        Objects.requireNonNull(sourcePath, "sourcePath darf nicht null sein");
        Objects.requireNonNull(updatedAt, "updatedAt darf nicht null sein");
        if (attemptCount < 0) {
            throw new IllegalArgumentException("attemptCount darf nicht negativ sein, war: " + attemptCount);
        }
    }
}
