-- V7: Haushaltsform, Personen (Name/Alter) und Planstartjahr wandern auf PLAN-Ebene.
--
-- Begruendung (SPEZIFIKATION 2.1, 9.30): Diese Angaben beschreiben den HAUSHALT, nicht eine
-- Planungsvariante. Unterscheiden sie sich, ist es ein anderer Plan -- kein anderes Szenario.
-- Solange sie am Szenario hingen, konnten zwei Szenarien desselben Plans verschiedene
-- Startjahre tragen; derselbe Ist-Satz waere dann je Szenario auf einem anderen Planjahr
-- gelandet.
--
-- Das PENSIONSALTER bleibt bewusst am Szenario -- es ist der Kern jedes
-- Frueh-/Spaetpensionierungs-Szenarios.

ALTER TABLE "Plan" ADD COLUMN "householdType" "HouseholdType";
ALTER TABLE "Plan" ADD COLUMN "startYear" INTEGER;

CREATE TABLE "PlanPerson" (
    "id" TEXT NOT NULL,
    "planId" TEXT NOT NULL,
    "role" "PersonRole" NOT NULL,
    "name" TEXT,
    "age" INTEGER NOT NULL,

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

CREATE UNIQUE INDEX "PlanPerson_planId_role_key" ON "PlanPerson"("planId", "role");

ALTER TABLE "PlanPerson" ADD CONSTRAINT "PlanPerson_planId_fkey"
    FOREIGN KEY ("planId") REFERENCES "Plan"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- --- Datenuebernahme aus dem BASISSZENARIO ------------------------------------------------
-- Das Basisszenario ist der kanonische Stand. Weichen Nebenszenarien ab, gewinnt die Basis.

UPDATE "Plan" p
SET "householdType" = s."householdType",
    "startYear"     = s."startYear"
FROM "Scenario" s
WHERE s."planId" = p."id" AND s."isBase" = true;

-- Sicherheitsnetz: Plaene ohne Basisszenario (sollte es nicht geben) nehmen irgendein Szenario.
UPDATE "Plan" p
SET "householdType" = s."householdType",
    "startYear"     = COALESCE(p."startYear", s."startYear")
FROM "Scenario" s
WHERE s."planId" = p."id" AND p."householdType" IS NULL;

INSERT INTO "PlanPerson" ("id", "planId", "role", "name", "age")
SELECT 'pp_' || pe."id", s."planId", pe."role", pe."name", pe."age"
FROM "Person" pe
JOIN "Scenario" s ON s."id" = pe."scenarioId"
WHERE s."isBase" = true
ON CONFLICT ("planId", "role") DO NOTHING;

-- Netz fuer Plaene, deren Basisszenario keine Personen traegt.
INSERT INTO "PlanPerson" ("id", "planId", "role", "name", "age")
SELECT DISTINCT ON (s."planId", pe."role") 'pp_' || pe."id", s."planId", pe."role", pe."name", pe."age"
FROM "Person" pe
JOIN "Scenario" s ON s."id" = pe."scenarioId"
ORDER BY s."planId", pe."role", s."isBase" DESC
ON CONFLICT ("planId", "role") DO NOTHING;

-- Ein Plan ohne Haushaltsform waere nicht rechenbar.
UPDATE "Plan" SET "householdType" = 'SINGLE' WHERE "householdType" IS NULL;
ALTER TABLE "Plan" ALTER COLUMN "householdType" SET NOT NULL;

-- --- Szenario-Ebene verschlanken ----------------------------------------------------------
-- Person traegt nur noch Rolle + Pensionsalter; Name und Alter kommen vom Plan.
ALTER TABLE "Person" DROP COLUMN "name";
ALTER TABLE "Person" DROP COLUMN "age";

ALTER TABLE "Scenario" DROP COLUMN "householdType";
ALTER TABLE "Scenario" DROP COLUMN "startYear";
