DROP VIEW IF EXISTS dziela casacade;
DROP FUNCTION IF EXISTS czy_wydac1 cascade;
DROP FUNCTION IF EXISTS czy_wydac2 cascade;
DROP FUNCTION IF EXISTS czy_wydac3 cascade;



CREATE TABLE Artysta(
    identyfikator integer PRIMARY KEY,
    imie varchar(15) NOT NULL,
    nazwisko varchar(20) NOT NULL,
    rok_urodzenia integer NOT NULL,
    rok_smierci integer CHECK (rok_smierci > rok_urodzenia)
);

CREATE TABLE Eksponat(
    identyfikator integer PRIMARY KEY,
    id_artysty integer references Artysta NULL,
    tytul varchar(30) NOT NULL,
    typ varchar(10) NOT NULL,
    wys integer NOT NULL CHECK (wys > 0),
    szer integer NOT NULL CHECK (szer > 0),
    waga integer NOT NULL CHECK (waga > 0),
    lokalizacja varchar(11) CHECK (lokalizacja IN ('Magazyn', 'Galeria', 'Wypozyczony')),
    najcenniejszy char(3) CHECK (najcenniejszy IN ('Tak', 'Nie'))
);


CREATE TABLE Instytucja(
    identyfikator integer PRIMARY KEY,
    nazwa varchar(30),
    miasto varchar(20)
);

CREATE TABLE Galeria(
    identyfikator integer PRIMARY KEY,
    nazwa varchar(25)
);
CREATE TABLE Sala(
    identyfikator integer PRIMARY KEY,
    id_galerii integer REFERENCES Galeria,
    nazwa varchar(20)
);

CREATE TABLE Historia(
    identyfikator integer PRIMARY KEY,
    eksponat_id integer REFERENCES Eksponat,
    lokalizacja varchar(11) CHECK (lokalizacja IN ('Magazyn', 'Galeria', 'Wypozyczony')),
    id_instytucji integer REFERENCES Instytucja,
    id_galerii integer REFERENCES Galeria,
    id_sali integer REFERENCES Sala,
    data_pocz date NOT NULL,
    data_koncowa date NOT NULL CHECK (data_koncowa > data_pocz)
);


---Modyfikuje lokalizacje Eksponatu po dodaniu wpisu do historii
CREATE OR REPLACE FUNCTION aktualizuj_lokalizacje() RETURNS TRIGGER AS $$
BEGIN
    UPDATE Eksponat
    SET lokalizacja = NEW.lokalizacja
    WHERE identyfikator = NEW.eksponat_id;
    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE TRIGGER lokalizacja 
    AFTER INSERT ON Historia
    FOR EACH ROW 
    EXECUTE PROCEDURE aktualizuj_lokalizacje();

---Sprawdza czy Eksponat nie jest najcenniejszy
CREATE OR REPLACE FUNCTION czy_wydac1() RETURNS TRIGGER AS $$
BEGIN
    IF ((SELECT najcenniejszy FROM Eksponat WHERE identyfikator = new.eksponat_id) = 'Tak') THEN
    RAISE EXCEPTION 'Muzeum nie wypozycza swoich najcenniejszych eksponatow';
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';

---Sprawdza warunek 30 dni rocznie
CREATE OR REPLACE FUNCTION czy_wydac2() RETURNS TRIGGER AS $$
DECLARE
        suma_dni_poza_muzeum INT;
 BEGIN
    
    SELECT SUM(COALESCE(
        
            IF EXTRACT(YEAR FROM h.data_pocz) = EXTRACT(YEAR FROM NEW.data_pocz) AND h.data_koncowa IS NOT NULL THEN 
                h.data_koncowa - h.data_pocz
            ELSE 0
        
        , 0)) INTO suma_dni_poza_muzeum
        FROM Historia h
        WHERE h.eksponat_id = new.eksponat_id AND h.lokalizacja = 'Wypozyczony'
        AND EXTRACT(YEAR FROM h.data_pocz) = EXTRACT(YEAR FROM NEW.data_pocz);

        IF suma_dni_poza_muzeum + (new.data_koncowa - data_pocz) > 30 THEN 
        RAISE EXCEPTION 'Eksponat przekroczy roczny limit 30 dni przebywania poza muzeum';
        END IF;
         
    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


---Sprzawdza czy w muzeum zostanie conajmniej jedno dzielo danego artysty w przypadku wypozyczenia
CREATE OR REPLACE FUNCTION czy_wydac3() RETURNS TRIGGER AS $$
DECLARE liczba_dziel int;
BEGIN
     SELECT COUNT(*) into liczba_dziel FROM Eksponat
     WHERE id_artysty = (Select id_artysty From Eksponat where identyfikator = new.eksponat_id) AND lokalizacja IN('Magazyn', 'Galeria')
     GROUP BY id_artysty;
     IF liczba_dziel <= 1 AND NEW.lokalizacja = 'Wypozyczony' THEN
    RAISE EXCEPTION 'Muzeum musi posiadać conajmniej jedno dzieło każdego z artystów';
     END IF;
    RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';


CREATE TRIGGER czy_wydac1
AFTER INSERT ON Historia
FOR EACH ROW
EXECUTE PROCEDURE czy_wydac1();

CREATE TRIGGER czy_wydac2
AFTER INSERT ON Historia
FOR EACH ROW
EXECUTE PROCEDURE czy_wydac2();

CREATE TRIGGER czy_wydac3
AFTER INSERT ON Historia
FOR EACH ROW
EXECUTE PROCEDURE czy_wydac3();

---Próba zagwarantowania posiadania w bazie tylko artystow ktorzy maja swoje dziela w muzeum ale ten sposob okazal sie bez sensu
--CREATE OR REPLACE FUNCTION check_artysta() RETURNS TRIGGER AS $$
--BEGIN
  --  IF (new.identyfikator NOT IN (SELECT DISTINCT id_artysty FROM Eksponat)) THEN
    --RAISE EXCEPTION 'Ten artysta nie ma zadnego dziela w naszym muzeum';
    --END IF;
    --RETURN NEW;
--END;
--$$ LANGUAGE 'plpgsql';

--CREATE TRIGGER check_artysta
--AFTER INSERT ON Artysta
--FOR EACH ROW
-- EXECUTE PROCEDURE check_artysta();
INSERT INTO Artysta VALUES(1,'Amedeo', 'Modigliani', 1884, 1920);
INSERT INTO Artysta VALUES(2, 'Lech', 'Lech', 1980);
INSERT INTO Artysta VALUES(3, 'Gustav', 'Klimt', 1862, 1918);
INSERT INTO Eksponat VALUES(1,1, 'Jeanne Hebuterne', 'obraz', 80,60,400,'Magazyn', 'Tak');
INSERT INTO Eksponat VALUES(2, 1, 'Beatrice','obraz', 600, 900, 65000, 'Magazyn', 'Nie');
INSERT INTO Eksponat VALUES(3, 3, 'Pocalunek','obraz', 200, 180, 10000, 'Magazyn', 'Tak');
INSERT INTO Eksponat VALUES(4, 2, 'Freya', 'rzezba', 200, 400, 40000, 'Magazyn', 'Nie');
INSERT INTO Eksponat VALUES(5, 1, 'Slepiec','obraz', 200, 180, 10000, 'Magazyn', 'Nie');
INSERT INTO Instytucja VALUES(1, 'Zacheta', 'Warszawa');
INSERT INTO Galeria VALUES(1, 'Utopia');
INSERT INTO Sala VALUES(1, 1, 'Glowna');
