
-- tables
CREATE TABLE artysta (
    id_a serial  primary key,
    imie varchar(32)  NOT NULL,
    nazwisko varchar(32)  NOT NULL,
    rok_urodzenia date  NOT NULL,
    rok_smierci date
);
CREATE TABLE wystawione(
    id_wystawy int primary key,
    eksponat_id int not null,
    galeria_id int not null,
    sala varchar(32) not null,
    data_wystawienia date not null,
    data_zakonczenia date null
);

CREATE TABLE eksponat (
    id_e serial  primary key,
    tytul varchar(255)  NOT NULL,
    typ varchar(128)  NOT NULL,
    szerokosc decimal(5,2)  NOT NULL,
    wysokosc decimal(5,2)  NOT NULL,
    waga decimal(5,2)  NOT NULL,
    cenne boolean  NOT NULL,
    artysta_id_a int  NULL,
    status varchar(128)  NOT NULL
);

CREATE TABLE galeria (
    id_galeria serial  primary key,
    nazwa varchar(40)  NOT NULL,
    sala Varchar(100)  NOT NULL,
    muzeum_naz varchar(64)  NOT NULL
);

CREATE TABLE historia_wypozyczen (
    id_wypozyczenia serial  primary key,
    eksponat_id int NOT NULL,
    instytucja_id_i int NOT NULL,
    data_wypozyczenia date NOT NULL,
    data_zakonczenia date NULL
);

CREATE TABLE instytucja (
    id_i serial  primary key,
    nazwa Varchar(128)  NOT NULL,
    miasto varchar(32)  NOT NULL
);

CREATE TABLE magazyn (
    id_magazyn serial  primary key,
    eksponat_id_e int not null,
    dota_magazynowania date not null,
    koniec_magazynowania date null

);

CREATE TABLE muzeum (
    nazwa varchar(64) primary key
);

-- foreign keys

ALTER TABLE galeria ADD CONSTRAINT galeria_muzeum
    FOREIGN KEY (muzeum_naz)
    REFERENCES muzeum (nazwa)  
;

ALTER TABLE wystawione ADD CONSTRAINT wyst_eksponat_id
    FOREIGN KEY (eksponat_id)
    REFERENCES eksponat (id_e)  
;

ALTER TABLE wystawione ADD CONSTRAINT wyst_galeria_id
    FOREIGN KEY (galeria_id)
    REFERENCES galeria (id_galeria)  
;

ALTER TABLE eksponat ADD CONSTRAINT eksponat_artysta
    FOREIGN KEY (artysta_id_a)
    REFERENCES artysta (id_a)  
;

ALTER TABLE historia_wypozyczen ADD CONSTRAINT wypozyczenia_eksponat
    FOREIGN KEY (eksponat_id)
    REFERENCES eksponat (id_e)  
;

ALTER TABLE historia_wypozyczen ADD CONSTRAINT wypozyczenia_instytucja
    FOREIGN KEY (instytucja_id_i)
    REFERENCES instytucja (id_i)  
;


ALTER TABLE magazyn ADD CONSTRAINT magazyn_eksponat
    FOREIGN KEY (eksponat_id_e)
    REFERENCES eksponat (id_e)  
;
CREATE OR REPLACE FUNCTION artysta_posiada_eksponat()
RETURNS TRIGGER AS $$
DECLARE
    art RECORD;
    iloscEksponatow INT;
BEGIN
    -- Iterujemy przez wszystkich artystów
    FOR art IN SELECT id_a, imie, nazwisko FROM artysta LOOP
        
        -- Sprawdzamy, czy artysta ma przynajmniej jeden eksponat w muzeum (wystawiony lub magazynowany)
        SELECT COUNT(*) INTO iloscEksponatow
        FROM eksponat
        WHERE artysta_id_a = art.id_a;

        -- Jeśli artysta nie ma eksponatów, wyświetlamy komunikat
        IF iloscEksponatow = 0 THEN
            RAISE NOTICE 'Artysta % % nie ma żadnych eksponatów', art.imie, art.nazwisko;
        END IF;
    END LOOP;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER artystaMaEksponat
AFTER INSERT ON artysta
FOR EACH ROW
EXECUTE FUNCTION artysta_posiada_eksponat();
