
CREATE TABLE Artysci (
    id_artysty int PRIMARY KEY,
    imie varchar(20)  NOT NULL,
    nazwisko varchar(20)  NOT NULL,
    rok_urodzenia int  NOT NULL,
    rok_smierci int  NULL
);

insert into Artysci values (1,'Jan','Matejko',1800,1870);
insert into Artysci values (2,'Fryderyk','Chopin',1805,1845);
insert into Artysci values (4,'Andrzej','Sapkowski',1950,NULL);
insert into Artysci values (101,'Leonardo','Da Vinci',1800,1870);

CREATE TABLE Eksponaty (
    id_eksp int  PRIMARY KEY,
    tytul varchar(40)  NOT NULL,
    typ varchar(20)  NOT NULL,
    wysokosc_cm decimal(8,1) NOT NULL CHECK (wysokosc_cm>0),
    szerokosc_cm decimal(8,1) NOT NULL CHECK (szerokosc_cm>0),
    waga_kg decimal(8,3) NOT NULL CHECK (waga_kg>0),
    id_artysty int references Artysci ON DELETE CASCADE,
    czy_cenny char(1)  NOT NULL DEFAULT 'N' CHECK (czy_cenny in ('T','N')),
    ile_poza int  NOT NULL DEFAULT 0
);

insert into Eksponaty values (1,'Panorama Raclawicka','obraz',300,500,10,1,'T',0);
insert into Eksponaty values (2,'Unia Lubelska','obraz',250,400,8,1,'N',6);
insert into Eksponaty values (3,'Dama z Gronostajem','obraz',60,30,3,101,'N',4);
insert into Eksponaty values (4,'Morze','obraz',120,240,7,NULL,'N',0);
insert into Eksponaty values (11,'Konstytucja','dokument',24,10,0.3,NULL,'N',0);
insert into Eksponaty values (12,'Etiuda','dokument',32,14,0.05,2,'T',0);
insert into Eksponaty values (13,'Marsz','dokument',36,14,0.05,2,'N',0);
insert into Eksponaty values (101,'Czas Pogardy','ksiazka',25,15,0.6,4,'N',0);

CREATE TABLE Galerie (
    id_galerii int  PRIMARY KEY,
    nazwa varchar(20)
);

insert into Galerie values(1,'Sztuk Pieknych');

CREATE TABLE Instytucje (
    id_instytucji int  PRIMARY KEY,
    nazwa varchar(20)  NOT NULL,
    miasto varchar(20)  NOT NULL
);

insert into Instytucje values(101,'Luwr','Paryz');
insert into Instytucje values(1,'Muzeum w Lublinie','Lublin');

CREATE TABLE Magazynowane (
    id_mag serial PRIMARY KEY,
    id_eksp int  NOT NULL references Eksponaty ON DELETE CASCADE,
    data_rozp date  NOT NULL,
    data_zak date 
);

insert into Magazynowane (id_eksp,data_rozp,data_zak) values
(13,'2025-01-05',NULL),
(11,'2025-01-05',NULL),
(3,'2025-01-01',NULL),
(2,'2025-01-06',NULL);

CREATE TABLE Wypozyczone (
    id_wyp serial  PRIMARY KEY,
    id_eksp int  NOT NULL references Eksponaty ON DELETE CASCADE,
    id_instytucji int  NOT NULL references Instytucje ON DELETE CASCADE,
    data_rozp date  NOT NULL,
    data_zak date 
);

insert into Wypozyczone (id_eksp,id_instytucji,data_rozp,data_zak)
values(13,101,'2025-01-01','2025-01-04'),
      (2,1,'2025-01-01','2025-01-06');

CREATE TABLE Wystawione (
    id_wys serial  PRIMARY KEY,
    id_eksp int  NOT NULL references Eksponaty ON DELETE CASCADE,
    id_galerii int  NOT NULL references Galerie ON DELETE CASCADE,
    sala int  NOT NULL,
    data_rozp date  NOT NULL,
    data_zak date  
);

insert into Wystawione (id_eksp,id_galerii,sala,data_rozp,data_zak) values
(4,1,1,'2025-01-01',NULL),
(1,1,1,'2025-01-01',NULL),
(12,1,2,'2025-01-01',NULL),
(101,1,2,'2025-01-01',NULL),
(11,1,2,'2025-01-01','2025-01-05');

--Funkcje

CREATE OR REPLACE FUNCTION mozna_wypozyczyc(id_eksp_pr int) RETURNS BOOLEAN AS $$
DECLARE
    ile_dni_poza int;
    cenny_status char;
    artysta_id int;
    dostepne_eksponaty int;
BEGIN
    SELECT ile_poza, czy_cenny, id_artysty INTO ile_dni_poza, cenny_status, artysta_id
    FROM Eksponaty
    WHERE id_eksp = id_eksp_pr;

    IF ile_dni_poza IS NULL THEN
        RAISE EXCEPTION 'Eksponat o podanym ID nie istnieje';
    END IF;

    IF cenny_status = 'T' THEN
        RETURN FALSE;
    END IF;

    IF ile_dni_poza > 30 THEN
        RETURN FALSE; 
    END IF;

    SELECT COUNT(*) INTO dostepne_eksponaty
    FROM Eksponaty E
    WHERE E.id_artysty = artysta_id
    AND NOT EXISTS (
        SELECT 1 FROM Wypozyczone W 
        WHERE W.id_eksp = E.id_eksp 
        AND W.data_zak IS NULL
    );

    IF dostepne_eksponaty < 2 THEN
        RETURN FALSE;
    END IF;

    RETURN TRUE;
END;
$$ LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION dodaj_eksponat(
    _id_eksp int,
    _tytul varchar(40),
    _typ varchar(20),
    _wysokosc_cm decimal(8,1),
    _szerokosc_cm decimal(8,1),
    _waga_kg decimal(8,3),
    _czy_cenny char(1),
    _id_artysty int,
    _ile_poza int
)
RETURNS VOID as $$
BEGIN
    INSERT INTO Eksponaty (id_eksp,tytul, typ, wysokosc_cm, szerokosc_cm, waga_kg, czy_cenny, id_artysty,ile_poza)
    VALUES (_id_eksp,_tytul, _typ, _wysokosc_cm, _szerokosc_cm, _waga_kg, _czy_cenny, _id_artysty,0);
END;
$$LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION dodaj_artyste(
    _id_artysty int,
    _imie varchar(20),
    _nazwisko varchar(20),
    _rok_urodzenia int,
    _rok_smierci int
) 
RETURNS VOID as $$
BEGIN
    INSERT INTO Artysci (id_artysty,imie, nazwisko, rok_urodzenia, rok_smierci)
    VALUES (_id_artysty,_imie, _nazwisko, _rok_urodzenia, _rok_smierci) ;

END;
$$LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION dodaj_galerie(
    _id_galerii int,
    _nazwa varchar(20)
) 
RETURNS VOID as $$
BEGIN
    INSERT INTO Galerie (id_galerii,nazwa)
    VALUES (_id_galerii,_nazwa);
END;
$$LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION dodaj_instytucje(
    _id_instytucji int,
    _nazwa varchar(20),
    _miasto varchar(20)
)
RETURNS VOID as $$
BEGIN
    INSERT INTO Instytucje (id_instytucji,nazwa, miasto)
    VALUES (_id_instytucji,_nazwa, _miasto);
END;
$$LANGUAGE plpgsql;
