-- Tabela: Aktualne_polozenie_eksponatu
CREATE TABLE Aktualne_polozenie_eksponatu (
    id serial  NOT NULL,
    id_galerii int  NOT NULL,
    id_instytucji int  NOT NULL,
    id_eksponatu int  NOT NULL,
    miasto varchar(100)  NOT NULL,
    CONSTRAINT Aktualne_polozenie_eksponatu_pk PRIMARY KEY (id)
);

-- Tabela: Eksponat
CREATE TABLE Eksponat (
    id_eksponatu serial  NOT NULL,
    tytul varchar(100)  NOT NULL,
    typ varchar(100)  NOT NULL,
    wysokosc decimal(10,2)  NOT NULL,
    szerokosc decimal(10,2)  NOT NULL,
    waga decimal(10,2)  NOT NULL,
    najcenniejszy boolean  NOT NULL,
    id_artysty int  NOT NULL,
    Tworca_id int  NOT NULL,
    CONSTRAINT Eksponat_pk PRIMARY KEY (id_eksponatu)
);

-- Tabela: Galeria
CREATE TABLE Galeria (
    id serial  NOT NULL,
    sala int  NOT NULL,
    nazwa varchar(50)  NOT NULL,
    miasto varchar(50)  NOT NULL,
    CONSTRAINT Galeria_pk PRIMARY KEY (id)
);

-- Tabela: Tworca
CREATE TABLE Tworca (
    id serial  NOT NULL,
    imie varchar(50)  NOT NULL,
    nazwisko varchar(50)  NOT NULL,
    rok_urodzenia smallint  NOT NULL,
    rok_smierci smallint  NULL,
    CONSTRAINT Tworca_pk PRIMARY KEY (id)
);

-- Tabela: Wypozyczenia
CREATE TABLE Wypozyczenia (
    id serial  NOT NULL,
    id_instytucji int  NOT NULL,
    id_eksponatu int  NOT NULL,
    start_wypozyczenia date  NOT NULL,
    koniec_wypozyczenia date  NOT NULL,
    lokalizacja_instytucji varchar(50)  NOT NULL,
    CONSTRAINT Wypozyczenia_pk PRIMARY KEY (id)
);

-- Tabela: historia_polozenia_eksponatow
CREATE TABLE historia_polozenia_eksponatow (
    id serial  NOT NULL,
    id_galerii int  NOT NULL,
    id_instytucji int  NOT NULL,
    id_eksponatu int  NOT NULL,
    typ_ruchu varchar(50)  NOT NULL,
    nazwa_instytucji varchar(100)  NOT NULL,
    nazwa_galerii varchar(100)  NOT NULL,
    miasto varchar(50)  NOT NULL,
    data_start date  NOT NULL,
    data_koniec date  NOT NULL,
    CONSTRAINT historia_polozenia_eksponatow_pk PRIMARY KEY (id)
);

-- Tabela: instytucje
CREATE TABLE instytucje (
    id serial  NOT NULL,
    nazwa varchar(100)  NOT NULL,
    miasto varchar(50)  NOT NULL,
    CONSTRAINT instytucje_pk PRIMARY KEY (id)
);

-- klucz obcy
-- Odniesienie: Aktualne_polozenie_eksponatu_Eksponat (Tabela: Aktualne_polozenie_eksponatu)
ALTER TABLE Aktualne_polozenie_eksponatu ADD CONSTRAINT Aktualne_polozenie_eksponatu_Eksponat
    FOREIGN KEY (id_eksponatu)
    REFERENCES Eksponat (id_eksponatu)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Odniesienie: Aktualne_polozenie_eksponatu_Galeria (Tabela: Aktualne_polozenie_eksponatu)
ALTER TABLE Aktualne_polozenie_eksponatu ADD CONSTRAINT Aktualne_polozenie_eksponatu_Galeria
    FOREIGN KEY (id_galerii)
    REFERENCES Galeria (id)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Odniesienie: Aktualne_polozenie_eksponatu_instytucje (Tabela: Aktualne_polozenie_eksponatu)
ALTER TABLE Aktualne_polozenie_eksponatu ADD CONSTRAINT Aktualne_polozenie_eksponatu_instytucje
    FOREIGN KEY (id_instytucji)
    REFERENCES instytucje (id)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Odniesienie: Eksponat_Tworca (Tabela: Eksponat)
ALTER TABLE Eksponat ADD CONSTRAINT Eksponat_Tworca
    FOREIGN KEY (Tworca_id)
    REFERENCES Tworca (id)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Odniesienie: Wypozyczenia_Eksponat (Tabela: Wypozyczenia)
ALTER TABLE Wypozyczenia ADD CONSTRAINT Wypozyczenia_Eksponat
    FOREIGN KEY (id_eksponatu)
    REFERENCES Eksponat (id_eksponatu)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Odniesienie: Wypozyczenia_instytucje (Tabela: Wypozyczenia)
ALTER TABLE Wypozyczenia ADD CONSTRAINT Wypozyczenia_instytucje
    FOREIGN KEY (id_instytucji)
    REFERENCES instytucje (id)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Odniesienie: historia_polozenia_eksponatow_Eksponat (Tabela: historia_polozenia_eksponatow)
ALTER TABLE historia_polozenia_eksponatow ADD CONSTRAINT historia_polozenia_eksponatow_Eksponat
    FOREIGN KEY (id_eksponatu)
    REFERENCES Eksponat (id_eksponatu)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Odniesienie: historia_polozenia_eksponatow_Galeria (Tabela: historia_polozenia_eksponatow)
ALTER TABLE historia_polozenia_eksponatow ADD CONSTRAINT historia_polozenia_eksponatow_Galeria
    FOREIGN KEY (id_galerii)
    REFERENCES Galeria (id)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Odniesienie: historia_polozenia_eksponatow_instytucje (Tabela: historia_polozenia_eksponatow)
ALTER TABLE historia_polozenia_eksponatow ADD CONSTRAINT historia_polozenia_eksponatow_instytucje
    FOREIGN KEY (id_instytucji)
    REFERENCES instytucje (id)  
    NOT DEFERRABLE 
    INITIALLY IMMEDIATE
;

-- Walidacja dat w tabeli Wypozyczenia
ALTER TABLE Wypozyczenia ADD CONSTRAINT check_dates CHECK (koniec_wypozyczenia > start_wypozyczenia);

-- Walidacja, że rok_urodzenia <= rok_smierci (jeśli rok_smierci nie jest NULL)
ALTER TABLE Tworca ADD CONSTRAINT check_years CHECK (rok_smierci IS NULL OR rok_urodzenia <= rok_smierci);

-- Walidacja pozytywnych wartości w tabeli Eksponat
ALTER TABLE Eksponat ADD CONSTRAINT check_dimensions CHECK (wysokosc > 0 AND szerokosc > 0 AND waga > 0);
