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

import java.nio.file.Path;
import java.util.List;
import java.util.Optional;

import de.gecheckt.pdf.umbenenner.application.dto.ModelPriceChangeSet;
import de.gecheckt.pdf.umbenenner.application.dto.ModelPriceView;

/**
 * GUI-interner Bridge-Port fuer die Verwaltung von Modell-Preisen.
 *
 * <p>Dieser Port ist <em>kein</em> hexagonaler Outbound-Port der Application-Schicht.
 * Er ist eine modul-interne Bruecke, ueber die Bootstrap die SQLite-basierte
 * Verwaltung der Tabelle {@code model_price} fuer den GUI-Tab bereitstellt,
 * ohne dass der GUI-Adapter direkt auf Repository-Implementierungen zugreift.
 *
 * <p>Der Parameter {@code configFilePath} wird benoetigt, damit die
 * Bootstrap-Implementierung die SQLite-Datenbank aus der aktuell geladenen
 * Konfigurationsdatei ableiten kann, ohne den Pfad global zu speichern.
 *
 * <p><strong>Threading:</strong> Implementierungen muessen sicher von einem
 * Hintergrund-Worker-Thread aufgerufen werden koennen. Aufrufe blockieren,
 * bis das Ergebnis vollstaendig vorliegt.
 */
public interface GuiModelPriceManagementPort {

    /**
     * Liefert alle persistierten Modell-Preise.
     *
     * @param configFilePath Pfad zur aktuell geladenen Konfigurationsdatei; nicht {@code null}
     * @return Liste der Modell-Preise; nie {@code null}
     */
    List<ModelPriceView> findAll(Path configFilePath);

    /**
     * Sucht den Eintrag fuer (Provider, Modellname).
     *
     * @param configFilePath Pfad zur aktuell geladenen Konfigurationsdatei; nicht {@code null}
     * @param provider       Provider-Identifikator
     * @param modelName      Modellname
     * @return Eintrag oder {@link Optional#empty()}
     */
    Optional<ModelPriceView> findByProviderAndModelName(Path configFilePath, String provider, String modelName);

    /**
     * Persistiert ein {@link ModelPriceChangeSet} atomar.
     *
     * @param configFilePath Pfad zur aktuell geladenen Konfigurationsdatei; nicht {@code null}
     * @param changeSet      Sammlung aus Upserts und Loeschungen; nicht {@code null}
     */
    void saveAllChanges(Path configFilePath, ModelPriceChangeSet changeSet);
}
