package de.gecheckt.pdf.umbenenner.application.dto;

import java.util.List;
import java.util.Objects;

/**
 * Atomar zu speichernder Block aus Upserts und Loeschungen.
 *
 * <p>Wird vom {@code ManageModelPricesUseCase} an das
 * {@code ModelPriceRepository.saveAllChanges(...)} weitergereicht. Die
 * Konfliktvalidierung (z.B. ein Schluessel sowohl in {@link #upserts()}
 * als auch {@link #deletions()}) erfolgt im Use Case <em>vor</em> dem
 * Aufruf der Repository-Methode. Die Repository-Implementierung darf das
 * Set damit als bereits konsistent voraussetzen und beschr&auml;nkt sich
 * auf die transaktionale Persistenz.
 *
 * @param upserts   Liste von Eintraegen, die eingefuegt oder aktualisiert werden sollen; nicht {@code null}
 * @param deletions Liste von Composite-Keys, die geloescht werden sollen; nicht {@code null}
 */
public record ModelPriceChangeSet(
        List<ModelPriceEntry> upserts,
        List<ModelPriceKey> deletions) {

    /**
     * Kompakter Konstruktor: kopiert die Listen defensiv und macht sie unveraenderlich.
     *
     * @throws NullPointerException wenn eine der Listen {@code null} ist
     */
    public ModelPriceChangeSet {
        Objects.requireNonNull(upserts, "upserts");
        Objects.requireNonNull(deletions, "deletions");
        upserts = List.copyOf(upserts);
        deletions = List.copyOf(deletions);
    }

    /**
     * Pruefung, ob das ChangeSet leer ist und somit keine Transaktion benoetigt.
     *
     * @return {@code true}, wenn weder Upserts noch Deletions enthalten sind
     */
    public boolean isEmpty() {
        return upserts.isEmpty() && deletions.isEmpty();
    }
}
