-- Usunięcie istniejących tabel

-- Tabele

-- Artysta
CREATE TABLE Artysta (
    id_artysty SERIAL PRIMARY KEY,
    imie VARCHAR(25) NOT NULL,
    nazwisko VARCHAR(50) NOT NULL,
    rok_urodzenia INT NOT NULL,
    rok_smierci INT
);

-- Eksponat
CREATE TABLE Eksponat (
    id_eksponatu SERIAL PRIMARY KEY,
    tytul VARCHAR(200) NOT NULL,
    typ VARCHAR(50) NOT NULL,
    wysokosc NUMERIC(6, 2) NOT NULL,
    szerokosc NUMERIC(6, 2) NOT NULL,
    waga NUMERIC(6, 2) NOT NULL,
    id_artysty INT,
    FOREIGN KEY (id_artysty) REFERENCES Artysta(id_artysty)
);

-- Galeria
CREATE TABLE Galeria (
    id_galerii SERIAL PRIMARY KEY,
    nazwa VARCHAR(50) NOT NULL,
    miasto VARCHAR(100) NOT NULL
);

-- Instytucja
CREATE TABLE Instytucja (
    id_instytucji SERIAL PRIMARY KEY,
    nazwa VARCHAR(75) NOT NULL,
    miasto VARCHAR(50) NOT NULL
);

-- Lokalizacja
CREATE TABLE Lokalizacja (
    id_lokalizacji SERIAL PRIMARY KEY,
    id_eksponatu INT NOT NULL,
    typ_lokalizacji VARCHAR(20) NOT NULL CHECK (typ_lokalizacji IN ('Magazyn', 'Galeria', 'Wypozyczenie')),
    id_galerii INT,
    id_instytucji INT,
    data_od DATE NOT NULL,
    data_do DATE,
    FOREIGN KEY (id_eksponatu) REFERENCES Eksponat(id_eksponatu),
    FOREIGN KEY (id_galerii) REFERENCES Galeria(id_galerii),
    FOREIGN KEY (id_instytucji) REFERENCES Instytucja(id_instytucji)
);

-- Funkcja sprawdzająca, czy eksponat przebywa poza muzeum dłużej niż 30 dni
CREATE OR REPLACE FUNCTION sprawdz_czas_wypozyczenia(id_eksponatu INT) RETURNS BOOLEAN AS $$
DECLARE
    czas_wypozyczenia INT;
BEGIN
    SELECT COALESCE(SUM(DATE_PART('day', COALESCE(data_do, CURRENT_DATE) - data_od)), 0)
    INTO czas_wypozyczenia
    FROM Lokalizacja
    WHERE id_eksponatu = id_eksponatu AND typ_lokalizacji = 'Wypozyczenie';

    IF czas_wypozyczenia > 30 THEN
        RETURN FALSE;
    ELSE
        RETURN TRUE;
    END IF;
END;
$$ LANGUAGE plpgsql;

-- Funkcja która wypożycza eksponat
CREATE OR REPLACE FUNCTION dodaj_wypozyczenie(
    id_eksponatu INT,
    id_instytucji INT,
    data_od DATE,
    data_do DATE
) RETURNS VOID AS $$
BEGIN
    IF NOT sprawdz_czas_wypozyczenia(id_eksponatu) THEN
        RAISE EXCEPTION 'Eksponat nie może przebywać poza muzeum dłużej niż 30 dni rocznie';
    END IF;

    INSERT INTO Lokalizacja (id_eksponatu, typ_lokalizacji, id_instytucji, data_od, data_do)
    VALUES (id_eksponatu, 'Wypozyczenie', id_instytucji, data_od, data_do);
END;
$$ LANGUAGE plpgsql;

-- Funkcja sprawdzająca, czy muzeum posiada co najmniej jeden eksponat każdego artysty
CREATE OR REPLACE FUNCTION sprawdz_minimalna_liczbe_eksponatow() RETURNS VOID AS $$
DECLARE
    brakujacy_artysta RECORD;
BEGIN
    FOR brakujacy_artysta IN
        SELECT a.id_artysty, a.imie, a.nazwisko
        FROM Artysta a
        LEFT JOIN Eksponat e ON a.id_artysty = e.id_artysty
        GROUP BY a.id_artysty, a.imie, a.nazwisko
        HAVING COUNT(e.id_eksponatu) = 0
    LOOP
        RAISE NOTICE 'Brakuje eksponatów dla artysty: % %', brakujacy_artysta.imie, brakujacy_artysta.nazwisko;
    END LOOP;
END;
$$ LANGUAGE plpgsql;
