-- Versionierung je Szenario (SPEZIFIKATION 3.8, 4.16).
--
-- Eine Version haelt den VOLLSTAENDIGEN Zustand des Szenarios als JSON (Form: PlanInput),
-- nicht eine Differenz. Grund: Alle Analysewerkzeuge nehmen ohnehin PlanInput entgegen --
-- damit lassen sich alte Staende ohne Umbau rechnen, anzeigen und wiederherstellen.

-- Laufende Hauptversion des Szenarios. Nebenversionen zaehlen in ScenarioVersion.
ALTER TABLE "Scenario" ADD COLUMN "currentMajor" INTEGER NOT NULL DEFAULT 1;

CREATE TABLE "ScenarioVersion" (
    "id" TEXT NOT NULL,
    "scenarioId" TEXT NOT NULL,
    -- Version A.B: major wird manuell hochgezogen, minor je Bearbeitungssitzung.
    "major" INTEGER NOT NULL,
    "minor" INTEGER NOT NULL,
    -- Pflicht bei Hauptversionen, sonst leer. Wiederherstellungen tragen hier ihre Herkunft.
    "comment" TEXT,
    "isMajor" BOOLEAN NOT NULL DEFAULT false,
    -- Wer die Version erzeugt hat. Heute immer der Eigentuemer; vorbereitet auf spaetere
    -- Freigabe an einen Finanzberater.
    "createdById" TEXT NOT NULL,
    -- Vollstaendiger Zustand (PlanInput als JSON).
    "snapshot" JSONB NOT NULL,
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    -- Wird bei Zusammenfassung innerhalb einer Bearbeitungssitzung mitgezogen.
    "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT "ScenarioVersion_pkey" PRIMARY KEY ("id")
);

CREATE UNIQUE INDEX "ScenarioVersion_scenarioId_major_minor_key"
    ON "ScenarioVersion"("scenarioId", "major", "minor");

-- Die Historie wird immer neuestzuerst gelesen.
CREATE INDEX "ScenarioVersion_scenarioId_createdAt_idx"
    ON "ScenarioVersion"("scenarioId", "createdAt");

ALTER TABLE "ScenarioVersion" ADD CONSTRAINT "ScenarioVersion_scenarioId_fkey"
    FOREIGN KEY ("scenarioId") REFERENCES "Scenario"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- Beim Loeschen eines Benutzers verschwinden dessen Plaene ohnehin per Cascade; der
-- Verweis bleibt bewusst RESTRICT-frei, damit die Historie nie ein Loeschen blockiert.
ALTER TABLE "ScenarioVersion" ADD CONSTRAINT "ScenarioVersion_createdById_fkey"
    FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
