-- PostgreSQL-only migration script.
-- Dieses Projekt-Backend nutzt Schemas, JSONB und PostgreSQL-Datentypen.
-- Nicht auf MariaDB/MySQL ausführen.

BEGIN;

CREATE TABLE IF NOT EXISTS falukant_data.relationship_state (
  id serial PRIMARY KEY,
  relationship_id integer NOT NULL UNIQUE,
  marriage_satisfaction integer NOT NULL DEFAULT 55 CHECK (marriage_satisfaction >= 0 AND marriage_satisfaction <= 100),
  marriage_public_stability integer NOT NULL DEFAULT 55 CHECK (marriage_public_stability >= 0 AND marriage_public_stability <= 100),
  lover_role text NULL CHECK (lover_role IN ('secret_affair', 'lover', 'mistress_or_favorite')),
  affection integer NOT NULL DEFAULT 50 CHECK (affection >= 0 AND affection <= 100),
  visibility integer NOT NULL DEFAULT 15 CHECK (visibility >= 0 AND visibility <= 100),
  discretion integer NOT NULL DEFAULT 50 CHECK (discretion >= 0 AND discretion <= 100),
  maintenance_level integer NOT NULL DEFAULT 50 CHECK (maintenance_level >= 0 AND maintenance_level <= 100),
  status_fit integer NOT NULL DEFAULT 0 CHECK (status_fit >= -2 AND status_fit <= 2),
  monthly_base_cost integer NOT NULL DEFAULT 0 CHECK (monthly_base_cost >= 0),
  months_underfunded integer NOT NULL DEFAULT 0 CHECK (months_underfunded >= 0),
  active boolean NOT NULL DEFAULT true,
  acknowledged boolean NOT NULL DEFAULT false,
  exclusive_flag boolean NOT NULL DEFAULT false,
  last_monthly_processed_at timestamp with time zone NULL,
  last_daily_processed_at timestamp with time zone NULL,
  notes_json jsonb NULL,
  flags_json jsonb NULL,
  created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT relationship_state_relationship_fk
    FOREIGN KEY (relationship_id)
    REFERENCES falukant_data.relationship(id)
    ON DELETE CASCADE
);

CREATE INDEX IF NOT EXISTS relationship_state_active_idx
  ON falukant_data.relationship_state (active);

CREATE INDEX IF NOT EXISTS relationship_state_lover_role_idx
  ON falukant_data.relationship_state (lover_role);

ALTER TABLE IF EXISTS falukant_data.child_relation
  ADD COLUMN IF NOT EXISTS legitimacy text NOT NULL DEFAULT 'legitimate';

ALTER TABLE IF EXISTS falukant_data.child_relation
  ADD COLUMN IF NOT EXISTS birth_context text NOT NULL DEFAULT 'marriage';

ALTER TABLE IF EXISTS falukant_data.child_relation
  ADD COLUMN IF NOT EXISTS public_known boolean NOT NULL DEFAULT false;

DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1
    FROM pg_constraint
    WHERE conname = 'child_relation_legitimacy_chk'
  ) THEN
    ALTER TABLE falukant_data.child_relation
      ADD CONSTRAINT child_relation_legitimacy_chk
      CHECK (legitimacy IN ('legitimate', 'acknowledged_bastard', 'hidden_bastard'));
  END IF;
END
$$;

DO $$
BEGIN
  IF NOT EXISTS (
    SELECT 1
    FROM pg_constraint
    WHERE conname = 'child_relation_birth_context_chk'
  ) THEN
    ALTER TABLE falukant_data.child_relation
      ADD CONSTRAINT child_relation_birth_context_chk
      CHECK (birth_context IN ('marriage', 'lover'));
  END IF;
END
$$;

COMMIT;

-- Rollback separat bei Bedarf:
-- BEGIN;
-- ALTER TABLE falukant_data.child_relation DROP CONSTRAINT IF EXISTS child_relation_birth_context_chk;
-- ALTER TABLE falukant_data.child_relation DROP CONSTRAINT IF EXISTS child_relation_legitimacy_chk;
-- ALTER TABLE falukant_data.child_relation DROP COLUMN IF EXISTS public_known;
-- ALTER TABLE falukant_data.child_relation DROP COLUMN IF EXISTS birth_context;
-- ALTER TABLE falukant_data.child_relation DROP COLUMN IF EXISTS legitimacy;
-- DROP TABLE IF EXISTS falukant_data.relationship_state;
-- COMMIT;
