DROP TABLE IF EXISTS Lokalizacja_eksponatu;
DROP TABLE IF EXISTS Wypozyczenie;
DROP TABLE IF EXISTS Instytucja_zewnetrzna;
DROP TABLE IF EXISTS Ekspozycja;
DROP TABLE IF EXISTS Galeria;
DROP TABLE IF EXISTS Eksponat;
DROP TABLE IF EXISTS Typ_eksponatu;
DROP TABLE IF EXISTS Tworca;

-- Table: Typ_eksponatu
CREATE TABLE Typ_eksponatu (
    id_typu SERIAL  PRIMARY KEY,
    nazwa_typu VARCHAR NOT NULL
);

-- Table: Tworca
CREATE TABLE Tworca (
    id_tworcy SERIAL  PRIMARY KEY,
    imie VARCHAR NOT NULL,
    nazwisko VARCHAR NOT NULL,
    rok_urodzenia INTEGER NOT NULL,
    rok_smierci INTEGER
);

-- Table: Eksponat
CREATE TABLE Eksponat (
    identyfikator SERIAL PRIMARY KEY,
    tytul VARCHAR NOT NULL,
    cenny BOOLEAN NOT NULL,
    waga FLOAT(2) NOT NULL,
    wysokosc FLOAT(2) NOT NULL,
    szerokosc FLOAT(2) NOT NULL,
    id_typu INTEGER NOT NULL REFERENCES Typ_eksponatu(id_typu),
    id_tworcy INTEGER REFERENCES Tworca(id_tworcy)
);

-- Table: Galeria
CREATE TABLE Galeria (
    id_galerii SERIAL PRIMARY KEY,
    nazwa_galerii VARCHAR NOT NULL
);

-- Table: Ekspozycja
CREATE TABLE Ekspozycja (
    id_ekspozycji SERIAL PRIMARY KEY,
    nr_sali INTEGER NOT NULL,
    id_galerii INTEGER NOT NULL REFERENCES Galeria(id_galerii)
);

-- Table: Instytucja_zewnetrzna
CREATE TABLE Instytucja_zewnetrzna (
    id_instytucji SERIAL PRIMARY KEY,
    nazwa_instytucji VARCHAR NOT NULL,
    miasto VARCHAR NOT NULL
);

-- Table: Wypozyczenie
CREATE TABLE Wypozyczenie (
    id_wypozyczenia SERIAL PRIMARY KEY,
    ilosc_dni INTEGER NOT NULL,
    id_instytucji INTEGER NOT NULL REFERENCES Instytucja_zewnetrzna(id_instytucji)
);

-- Table: Lokalizacja_eksponatu
CREATE TABLE Lokalizacja_eksponatu (
    id SERIAL PRIMARY KEY,
    start DATE NOT NULL,
    koniec DATE,
    w_magazynie BOOLEAN NOT NULL,
    aktualne BOOLEAN NOT NULL,
    identyfikator INTEGER NOT NULL REFERENCES Eksponat(identyfikator),
    id_ekspozycji INTEGER REFERENCES Ekspozycja(id_ekspozycji),
    id_wypozyczenia INTEGER REFERENCES Wypozyczenie(id_wypozyczenia)
);

DROP FUNCTION IF EXISTS wypisz_eksponaty_tworcy(imie_tworcy VARCHAR, nazwisko_tworcy VARCHAR);

CREATE OR REPLACE FUNCTION wypisz_eksponaty_tworcy(imie_tworcy VARCHAR, nazwisko_tworcy VARCHAR)
RETURNS TABLE (
    identyfikator INTEGER,
    tytul VARCHAR,
    cenny BOOLEAN,
    waga REAL,
    wysokosc REAL,
    szerokosc REAL
) AS $$
BEGIN
    RETURN QUERY
    SELECT
        e.identyfikator,
        e.tytul,
        e.cenny,
        e.waga,
        e.wysokosc,
        e.szerokosc
    FROM Eksponat e
    JOIN Tworca t ON e.id_tworcy = t.id_tworcy
    WHERE t.imie = imie_tworcy AND t.nazwisko = nazwisko_tworcy;
END;
$$ LANGUAGE plpgsql;

ALTER TABLE Tworca ADD CONSTRAINT check_rok CHECK (rok_urodzenia < rok_smierci);