CREATE TABLE artysta (
  id SERIAL PRIMARY KEY,
  imie VARCHAR(50) NOT NULL,
  nazwisko VARCHAR(50) NOT NULL,
  rok_urodzenia INT,
  rok_smierci INT
);

CREATE TABLE eksponat (
  id SERIAL PRIMARY KEY,
  tytul VARCHAR(100) NOT NULL,
  typ VARCHAR(50) NOT NULL,
  wysokosc NUMERIC,
  szerokosc NUMERIC,
  waga NUMERIC,
  artysta_id INT REFERENCES artysta(id),
  czy_cenny BOOL
);

CREATE TABLE galeria (
  id SERIAL PRIMARY KEY,
  nazwa VARCHAR(100) NOT NULL,
  lokalizacja VARCHAR(100)
);

CREATE TABLE instytucja (
  id SERIAL PRIMARY KEY,
  nazwa VARCHAR(100) NOT NULL,
  miasto VARCHAR(50)
);

CREATE TABLE historia (
  id SERIAL PRIMARY KEY,
  eksponat_id INT NOT NULL REFERENCES eksponat(id),
  data_rozpoczecia DATE NOT NULL,
  data_zakonczenia DATE,
  galeria_id INT,
  instytucja_id INT REFERENCES instytucja(id),
  typ VARCHAR(50) CHECK (typ IN ('magazyn', 'galeria', 'wypozyczenie'))
);

CREATE OR REPLACE FUNCTION dodaj_wypozyczenie(
    p_eksponat_id INT,
    p_instytucja_id INT,
    p_data_rozp DATE,
    p_data_zak DATE
) RETURNS VOID AS $$
DECLARE
    total_days INT;
BEGIN
    SELECT COALESCE(SUM(p_data_zak - data_rozpoczecia), 0)
    INTO total_days
    FROM historia
    WHERE eksponat_id = p_eksponat_id 
      AND typ = 'wypozyczenie'
      AND EXTRACT(YEAR FROM data_rozpoczecia) = EXTRACT(YEAR FROM p_data_rozp);

    IF total_days + (p_data_zak - p_data_rozp) > 30 THEN
        RAISE EXCEPTION 'Limit wypozyczenia przekroczony dla eksponatu %', p_eksponat_id;
    END IF;

    INSERT INTO historia (eksponat_id, typ, data_rozpoczecia, data_zakonczenia, instytucja_id)
    VALUES (p_eksponat_id, 'wypozyczenie', p_data_rozp, p_data_zak, p_instytucja_id);
END;
$$ LANGUAGE plpgsql;

