DROP TABLE IF EXISTS Historia CASCADE;
DROP TABLE IF EXISTS Artysci_Eksponaty CASCADE;
DROP TABLE IF EXISTS Eksponaty CASCADE;
DROP TABLE IF EXISTS Artysci CASCADE;
DROP TABLE IF EXISTS Galerie CASCADE;
DROP TABLE IF EXISTS Instytucje CASCADE;

CREATE TABLE Eksponaty (
    id serial PRIMARY KEY,
    tytul varchar(20) NOT NULL,
    typ varchar(10) NOT NULL,
    wysokosc_cm smallint CHECK (wysokosc_cm > 0),
    szerokosc_cm smallint CHECK (szerokosc_cm > 0),
    waga_dag integer CHECK (waga_dag > 0)
);

CREATE TABLE Artysci (
    id serial PRIMARY KEY,
    nazwisko varchar(30) NOT NULL,
    rok_urodzenia date NOT NULL,
    rok_zgonu date,
    CONSTRAINT chk_rok_zgonu CHECK (rok_zgonu IS NULL OR rok_zgonu > rok_urodzenia)
);

CREATE TABLE Artysci_Eksponaty (
    id serial PRIMARY KEY,
    id_artysta integer NOT NULL REFERENCES Artysci,
    id_eksponat integer NOT NULL REFERENCES Eksponaty(id) ON DELETE CASCADE
);

CREATE TABLE Galerie (
    id serial PRIMARY KEY,
    nazwa varchar(20) NOT NULL
);

CREATE TABLE Instytucje (
    id serial PRIMARY KEY,
    nazwa varchar(50) NOT NULL,
    miasto varchar(20) NOT NULL
);

CREATE TABLE Historia (
    id serial PRIMARY KEY,
    eksponat_id integer NOT NULL REFERENCES Eksponaty(id) ON DELETE CASCADE,
    instytucja_id integer REFERENCES Instytucje,
    galeria_id integer REFERENCES Galerie,
    czy_magazyn boolean NOT NULL,
    od date,
    "do" date,
    -- Warunek: różnica ("do" - od) nie może przekraczać 30 dni dla wypożyczenia do instytucji
    CHECK (
        instytucja_id IS NULL
        OR
        (
            od IS NULL
            OR "do" IS NULL
            OR ("do" - od) <= 30
        )
    )
);

-- Usuwanie artysty jeśli po usunięciu wpisu z Artysci_Eksponaty nie ma już przypisanych eksponatów
CREATE OR REPLACE FUNCTION delete_artysta_if_no_eksponaty()
RETURNS trigger AS $$
BEGIN
    IF NOT EXISTS (
        SELECT 1
        FROM Artysci_Eksponaty
        WHERE id_artysta = OLD.id_artysta
    ) THEN
        DELETE FROM Artysci WHERE id = OLD.id_artysta;
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_delete_artysta
AFTER DELETE ON Artysci_Eksponaty
FOR EACH ROW
EXECUTE FUNCTION delete_artysta_if_no_eksponaty();
