-- dml.sql
-- Скрипта за пополнување на табелите со податоци.

SET synchronous_commit = OFF;

INSERT INTO Regions (name) VALUES
('Скопски'), ('Пелагониски'), ('Вардарски'), ('Источен'),
('Североисточен'), ('Југозападен'), ('Полошки'), ('Југоисточен');

INSERT INTO Site_Types (name) VALUES
('Антички локалитет'), ('Опсерваторија'),
('Средновековен локалитет'), ('Археолошки парк'),('Тумба (Неолитска населба)'),('Наколна населба'),
('Мегалитска опсерваторија'),('Антички град'),('Некропола'),('Римски терми'),('Аквадукт'),('Вила Рустика'),
('Тврдина (Кале)'),('Ранохристијанска базилика'),('Средновековен манастир'),('Антички рудник');

INSERT INTO Protection_Status (name) VALUES
('Заштитен'), ('Делумно заштитен'), ('Незаштитен');

INSERT INTO Roles (role_name) VALUES
('Admin'), ('Researcher'), ('Conservator'), ('Visitor');

INSERT INTO Status_Types (status_name, type) VALUES
('Изложен', 'object'),        
('Депониран', 'object'),       
('На конзервација', 'object'),
('Објавено', 'publication'), 
('Во подготовка', 'publication'),
('Одобрено', 'access'),   
('Во обработка', 'access'),   
('Одбиено', 'access');

INSERT INTO Materials (name) VALUES
('Керамика'), ('Бронза'), ('Железо'),
('Камен'), ('Стакло'), ('Злато'),
('Сребро'), ('Коска'), ('Дрво');

UPDATE Materials
SET description_materials = CASE 
    WHEN material_id % 4 = 0 THEN 'Природен материјал со широка употреба во изработка на предмети.'
    WHEN material_id % 4 = 1 THEN 'Често користен материјал во традиционални и модерни техники.'
    WHEN material_id % 4 = 2 THEN 'Материјал со специфични физички и хемиски својства.'
    ELSE 'Историски значаен материјал со културна вредност.'
END;

INSERT INTO Categories (name, description_category) VALUES
('Орудија и оружје', 'Предмети користени за работа, лов и војување, изработени од камен, коска или метал.'),
('Накит', 'Декоративни предмети (фибули, обетки, прстени) изработени од злато, сребро, бронза или стакло.'),
('Садови и керамика', 'Предмети за секојдневна употреба, складирање храна (амфори, питоси) и обредни цели.'),
('Монети', 'Метални парични единици од различни периоди (пајонски, македонски, римски, византиски).'),
('Скулптури и пластика', 'Уметнички дела од мермер, камен или бронза, вклучувајќи статуи, бисти и релјефи.'),
('Теракотни предмети', 'Предмети од печена земја, вклучувајќи ги уникатните Винички икони и фигурини.'),
('Епиграфски споменици', 'Камени натписи, надгробни стели и почесни плочи со историски записи.'),
('Мозаици', 'Подни и ѕидни декорации изработени од мали камчиња (тесери), карактеристични за базиликите.'),
('Архитектонски елементи', 'Делови од градби како капители, столбови и мермерни прагови.'),
('Опрема за секојдневие', 'Светилки (луцерни), коскени игли, огледала и други предмети за домаќинството.');

INSERT INTO Municipalities (name) VALUES
('Скопје'), ('Битола'), ('Охрид'), ('Виница'),('Штип'),('Кавадарци'),('Прилеп'), ('Гевгелија'), ('Струмица'), ('Куманово');

INSERT INTO Institutions (name, address,city) VALUES
('Археолошки музеј на Македонија', 'Кеј Димитар Влахов бб', 'Скопје'),
('Музеј на Македонија', 'Куршумли Ан бб', 'Скопје'), -- Ова е националниот музеј во Старата Чаршија
('Музеј на град Скопје', 'Улица Македонија бб', 'Скопје'),
('Меморијален центар на Холокаустот на Евреите од Македонија', 'Улица Тетовска бб', 'Скопје'),
('Природонаучен музеј на Македонија', 'Булевар Илинден 86', 'Скопје'),

('НУ Завод и музеј Битола', 'Улица Климент Охридски бб', 'Битола'),
('НУ Завод и музеј Прилеп', 'Улица Александар Македонски 142', 'Прилеп'),
('НУ Завод и музеј Охрид', 'Улица Цар Самоил 62', 'Охрид'), -- Куќата на Робевци
('Национален парк Галичица - Музејски центар', 'Улица Наум Охридски 124', 'Охрид'),
('НУ Завод и музеј Струга', 'Улица Партизанска бб', 'Струга'),

('НУ Завод и музеј Струмица', 'Улица 27-ми Март бб', 'Струмица'),
('НУ Завод и музеј Штип', 'Улица Тошо Арсов 10', 'Штип'),
('Народен музеј Велес', 'Улица 8-ми Септември бб', 'Велес'),
('НУ Музеј на град Гевгелија', 'Улица Маршал Тито бб', 'Гевгелија'),
('НУ Музеј Радовиш', 'Улица 22-ри Октомври бб', 'Радовиш'),
('НУ Музеј на град Кочани', 'Улица Маршал Тито бб', 'Кочани'),

('НУ Музеј Куманово', 'Улица 11-ти Октомври бб', 'Куманово'),
('Музеј на Тетовскиот крај', 'Улица Иво Лола Рибар бб', 'Тетово'),
('Музеј на град Кратово', 'Улица Гоце Делчев бб', 'Кратово'),
('Музеј "Западна Македонија во НОВ"', 'Улица Ослободување бб', 'Кичево'),
('Музеј на град Дебар', 'Улица 8-ми Септември бб', 'Дебар');

WITH first_names AS (
  SELECT ARRAY['Ivan','Ana','Marko','Elena','Stefan','Marija'] AS fn_arr
),
last_names AS (
  SELECT ARRAY['Petrov','Stojanovska','Trajkov','Dimitrova','Nikolov','Ivanova'] AS ln_arr
)
INSERT INTO Users (username, full_name, email, password_hash, role_id)
SELECT 
    'user_' || i,
    fn_arr[ceil(random()*array_length(fn_arr,1))] || ' ' ||
    ln_arr[ceil(random()*array_length(ln_arr,1))],
    'user' || i || '@mail.com',
    'pass',
    floor(random()*4 + 1)
FROM generate_series(1, 2000) s(i), first_names, last_names;

INSERT INTO User_Details (user_id,institution_id,specialization)
SELECT
	user_id,
	floor(random()*21+1),
	CASE floor(random()*7)
		WHEN 0 THEN 'Aрхеологија'
		WHEN 1 THEN 'Конзервација'
		WHEN 2 THEN 'Нумизматика'
		WHEN 3 THEN 'Етнологија'
		WHEN 4 THEN 'Историја на уметност'
		WHEN 5 THEN 'Подводна археологија'
		WHEN 6 THEN 'Емиграфика'
	END
	FROM Users u
	JOIN Roles r ON u.role_id=r.role_id
	WHERE r.role_name != 'Visitor';

INSERT INTO Sites(site_name,site_type_id,region_id,
					protection_status_id,latitude,longitude,altitude,discovery_year,
					description,municipality_id,is_active,created_at)
SELECT
	s.name || ' - ' || s.loc,
	s.type_id,
	floor(random()*8+1),
	floor(random()*3+1),
	40.8+(random()*1.5),
	20.5+(random()*2.5),
	(150+(random()*1100))::int,
	1850+(random()*175)::int,
	
	CASE
		WHEN s.name IN ('Градиште', 'Кале', 'Кула') THEN
			'Стратешко утврдување со остатоци од дефанзивни ѕидови и кули, датира од ' ||
			(ARRAY['антиката', 'доцната антика', 'средниот век'])[floor(random()*3+1)] || '.'
		WHEN s.name IN ('Тумба', 'Могила') THEN
		'Повеќеслојна праисториска населба со богат инвентар на керамички наоди и остатоци од ' ||
			(ARRAY['неолитски', 'енеолитски', 'бронзени'])[floor(random()*2+1)]
		ELSE
			'Археолошки комплекс со значајни архитектонски остатоци и фрагментирана подвижна керамика.'
	END,
	
	floor(random()*10+1),
	(random()>0.1),
	NOW()-(random()*interval '500 days')
	
	FROM(
		SELECT 
			s.i,
			(ARRAY['Градиште', 'Тумба', 'Кале', 'Црквиште', 'Висока', 'Могила', 'Бања', 'Манастир', 'Чука', 'Кула'])
			[floor(random()*10+1)] as name,
			(ARRAY['с. Злокуќани', 'с. Моноспитово', 'с. Таор', 'с. Кожле', 'Битола', 'Прилеп', 'с. Возарци', 'с. Радолишта', 'с. Вевчани', 'с. Смолани'])
			[floor(random()*10+1)] || ' (' || s.i || ')' as loc,
			floor(random()*4+1) as type_id
		FROM generate_series(1,6000) s(i)
	)s;

INSERT INTO Objects (
    inventory_number, title, current_status_id, site_id, 
    creation_year, acquisition_date, found_by_user_id, description
)
SELECT 
    'INV-' || i, 
    CASE 
        WHEN random() < 0.3 THEN 'Керамички сад'
        WHEN random() < 0.6 THEN 'Бронзен предмет'
        WHEN random() < 0.8 THEN 'Монета'
        ELSE 'Фрагмент'
    END,
    (SELECT status_id FROM Status_Types WHERE type = 'object' LIMIT 1),
    floor(random() * 6000 + 1), 
    (random() * 2000 + 1)::int, 
    NOW() - (random() * interval '95 years'),
    floor(random() * 2000 + 1), 
    (ARRAY[
        'Одлично зачуван примерок.',
        'Потребна е итна конзервација.',
        'Видливи траги од горење.',
        'Пронајден во станбен објект.',
        'Специфична декорација.',
        NULL
    ])[floor(random() * 6 + 1)]
FROM generate_series(1, 2000000) AS i;

INSERT INTO Fragments (
    description, site_id, object_id, status_id, found_by_user_id, discovery_date, parent_fragment_id
)
SELECT 
    CASE 
        WHEN random() < 0.15 THEN 'Керамички фрагмент од сад'
        WHEN random() < 0.30 THEN 'Фрагмент од амфора'
        WHEN random() < 0.45 THEN 'Бронзен украсен дел'
        WHEN random() < 0.60 THEN 'Фрагмент од монета'
        WHEN random() < 0.75 THEN 'Камен архитектонски дел'
        WHEN random() < 0.90 THEN 'Фрагмент од римска керамика'
        ELSE 'Фрагмент од алат од железно време'
    END,
    st_site.ids[floor(random() * array_length(st_site.ids, 1) + 1)],
    st_object.ids[floor(random() * array_length(st_object.ids, 1) + 1)],
    st_status.ids[floor(random() * array_length(st_status.ids, 1) + 1)],
    st_user.ids[floor(random() * array_length(st_user.ids, 1) + 1)],
    NOW() - (floor(random() * 2000) * interval '1 day'),
    NULL
FROM generate_series(1, 500000)
CROSS JOIN (SELECT array_agg(site_id) AS ids FROM Sites) st_site
CROSS JOIN (SELECT array_agg(object_id) AS ids FROM Objects) st_object
CROSS JOIN (SELECT array_agg(status_id) AS ids FROM Status_Types WHERE type='object') st_status
CROSS JOIN (SELECT array_agg(user_id) AS ids FROM Users) st_user;

INSERT INTO Fragments (description, site_id, object_id, status_id, found_by_user_id, discovery_date, parent_fragment_id)
SELECT 
    'Под-фрагмент',
    st_sites.ids[floor(random()*array_length(st_sites.ids,1)+1)],
    NULL,
    st_status.ids[floor(random()*array_length(st_status.ids,1)+1)],
    st_user.ids[floor(random()*array_length(st_user.ids,1)+1)],
    NOW() - (random()*500)*interval '1 day',
    st_parents.ids[floor(random()*array_length(st_parents.ids,1)+1)]
FROM generate_series(1, 500000)
CROSS JOIN (SELECT array_agg(fragment_id) as ids FROM (SELECT fragment_id FROM Fragments LIMIT 200000) p) st_parents
CROSS JOIN (SELECT array_agg(site_id) as ids FROM Sites) st_sites
CROSS JOIN (SELECT array_agg(status_id) as ids FROM Status_Types) st_status
CROSS JOIN (SELECT array_agg(user_id) as ids FROM Users) st_user;

INSERT INTO Fragments (description, site_id, object_id, status_id, found_by_user_id, discovery_date, parent_fragment_id)
SELECT 
    case
    	WHEN random() < 0.15 THEN 'Генерален фрагмент'
	        WHEN random() < 0.30 THEN 'Фрагмент од амфора'
	        WHEN random() < 0.45 THEN 'Генерален фрагмент'
	        WHEN random() < 0.60 THEN 'Фрагмент од монета'
	        WHEN random() < 0.75 THEN 'Генерален фрагмент'
	        WHEN random() < 0.90 THEN 'Фрагмент од римска керамика'
    end,
    st_sites.ids[floor(random()*array_length(st_sites.ids,1)+1)],
    CASE WHEN random() < 0.8 THEN st_objects.ids[floor(random()*array_length(st_objects.ids,1)+1)] ELSE NULL END,
    st_status.ids[floor(random()*array_length(st_status.ids,1)+1)],
    st_user.ids[floor(random()*array_length(st_user.ids,1)+1)],
    NOW() - (random()*1000)*interval '1 day',
    NULL
FROM generate_series(1, 500000)
CROSS JOIN (SELECT array_agg(site_id) as ids FROM Sites) st_sites
CROSS JOIN (SELECT array_agg(object_id) as ids FROM Objects) st_objects
CROSS JOIN (SELECT array_agg(status_id) as ids FROM Status_Types) st_status
CROSS JOIN (SELECT array_agg(user_id) as ids FROM Users) st_user;

INSERT INTO Authors (full_name)
SELECT 
    first_names.name || ' ' || last_names.surname
FROM 
    (SELECT unnest(ARRAY[
        'Иван','Петар','Гоце','Марко','Никола','Александар',
        'Елена','Марија','Даниела','Снежана','Тамара','Кристина',
        'Влатко','Бојан','Љупчо','Стефан','Зоран','Кирил'
    ]) AS name) first_names,
    
    (SELECT unnest(ARRAY[
        'Микулчиќ','Кузман','Манев','Алексов','Стојанов','Петров',
        'Илиев','Георгиев','Марков','Тодоров','Димитров','Павлов',
        'Костов','Ристов','Наумов','Спасов','Стојков','Цветков'
    ]) AS surname) last_names,
    
    generate_series(1, 50000) g(i)
LIMIT 50000;

INSERT INTO Publications (
    request_date,
    main_author_id,
    title,
    status_id,
    publisher_location
)
SELECT 
    CURRENT_DATE - (random()*3000)::int,

    st_author.ids[floor(random()*array_length(st_author.ids,1)+1)],
    CASE 
        WHEN random() < 0.2 THEN 'Археолошки истражувања во Вардарска долина'
        WHEN random() < 0.4 THEN 'Римски период на Балканот: анализа на наоди'
        WHEN random() < 0.6 THEN 'Средновековни утврдувања во Македонија'
        WHEN random() < 0.8 THEN 'Културно наследство на античка Македонија'
        ELSE 'Конзервација и реставрација на археолошки објекти'
    END,
	st_status.ids[floor(random()*array_length(st_status.ids,1)+1)],
    CASE 
        WHEN random() < 0.3 THEN 'Skopje'
        WHEN random() < 0.5 THEN 'Bitola'
        WHEN random() < 0.7 THEN 'Ohrid'
        ELSE 'Strumica'
    END
FROM generate_series(1, 500000)
CROSS JOIN(SELECT array_agg(author_id) as ids FROM Authors)st_author
CROSS JOIN(SELECT array_agg(status_id) as ids FROM Status_Types)st_status;

INSERT INTO Culture (name, origin_region_id, description, period_from_year, period_to_year)
VALUES
-- PRAISTORIJA
('Палеолитска култура', 1, 'Рани човечки заедници и ловци-собирачи', -100000, -10000),
('Неолитска култура', 1, 'Први земјоделски заедници и села', -7000, -3000),
('Бронзено време', 2, 'Развој на металургија и племенски општества', -3000, -1200),
('Железно време', 3, 'Племенски култури пред антика', -1200, -500),

-- ANTIKA
('Пајонска култура', 4, 'Античко племе во регионот на Вардар', -1000, -200),
('Античка македонска култура', 1, 'Кралството на Македонија', -800, -168),
('Хеленистичка култура', 1, 'Период по Александар Велики', -323, -31),

-- RIMSKI PERIOD
('Римска провинциска култура', 2, 'Римска администрација и урбан развој', -168, 300),
('Доцноримска култура', 3, 'Криза и трансформација на Римската империја', 300, 600),

-- VIZANTIJA
('Рановизантиска култура', 4, 'Рано христијанство и византиска уметност', 330, 800),
('Средновизантиска култура', 5, 'Развој на црква и феудализам', 800, 1200),
('Доцновизантиска култура', 5, 'Ослабување на Византија', 1200, 1453),

-- SREDEN VEK
('Словенска култура', 6, 'Доаѓање на словенските племиња', 600, 1000),
('Средновековна балканска култура', 6, 'Феудални држави на Балканот', 1000, 1400),

-- OSMANSKI PERIOD
('Османлиска култура', 7, 'Османлиско владеење на Балканот', 1400, 1912),

-- MODERNO
('Современа култура', 8, 'Модерен период по ослободувањето', 1912, 2020);

WITH obj AS (
    SELECT object_id FROM Objects
),
mat AS (
    SELECT material_id FROM Materials
),
pairs AS (
    SELECT 
        obj.object_id,
        mat.material_id,
        row_number() OVER () AS rn
    FROM obj
    CROSS JOIN mat
)

INSERT INTO Materials_Objects (object_id, material_id)
SELECT
	st_object_id.ids[floor(random()*array_length(st_object_id.ids,1)+1)],
	st_material_id.ids[floor(random()*array_length(st_material_id.ids,1)+1)]
FROM generate_series(1,500000)
CROSS JOIN(SELECT array_agg(object_id) as ids FROM Objects)st_object_id
CROSS JOIN(SELECT array_agg(material_id) as ids FROM Materials)st_material_id
on conflict do nothing;

WITH obj AS (
    SELECT array_agg(object_id) AS oids FROM Objects
),
inst AS (
    SELECT array_agg(institution_id) AS insts FROM Institutions
)

INSERT INTO Conservation_Projects (
    project_name,
    start_date,
    end_date,
    budget,
    description_project,
    institution_id,
    object_id
)
SELECT 
    name || ' ' || i,
	t.start_d,
    t.start_d + (1 + floor(random()*1000)) * interval '1 day',
    (1000 + random()*99000)::numeric(10,2),
    name || ' - детално истражување и конзервација на артефактот.',
    inst.insts[1 + floor(random()*array_length(inst.insts,1))::int],
    obj.oids[1 + floor(random()*array_length(obj.oids,1))::int]

FROM generate_series(1, 200000) i,
     obj, inst,
     LATERAL (
        SELECT 
            CASE 
                WHEN random() < 0.25 THEN 'Проект за конзервација на керамика'
                WHEN random() < 0.50 THEN 'Реставрација на антички објекти'
                WHEN random() < 0.75 THEN 'Археолошко истражување на локалитет'
                ELSE 'Дигитализација на културно наследство'
            END AS name,
			NOW() - (floor(random()*2000+i*0))*interval '30  days' AS start_d
     ) t;

WITH obj AS (
    SELECT array_agg(object_id) AS oids FROM Objects
)
INSERT INTO Treatments (object_id, treatment_date,description)
SELECT 
    obj.oids[1 + floor(random()*array_length(obj.oids,1))::int],
    CURRENT_DATE - (floor(random()*1000))::int,
	CASE 
	    WHEN random() < 0.25 THEN 'Механичко чистење на површински наслоги и земја'
	    WHEN random() < 0.40 THEN 'Хемиска стабилизација на кородирани метални делови'
	    WHEN random() < 0.55 THEN 'Консолидација на кршлива керамика со паралоид B-72'
	    WHEN random() < 0.70 THEN 'Превентивна десалинизација во дејонизирана вода'
	    WHEN random() < 0.80 THEN 'Лепење на фрагменти со реверзибилен лепак'
	    WHEN random() < 0.90 THEN 'Реставрација на недостатоци со гипс и ретуширање'
	    ELSE 'Нанесување на заштитен микрокристален восок'
END
FROM obj, generate_series(1, 500000);

WITH o AS (
    SELECT array_agg(object_id) AS oids FROM Objects
),
s AS (
    SELECT array_agg(status_id) as ids FROM Status_Types WHERE type='object'
)
INSERT INTO Condition_Assessment (
    assessment_date,
    notes,
    object_id,
    status_id
)
SELECT 
    CURRENT_DATE - (floor(random()*2000))::int,
    'Condition note ' || i,
    o.oids[i],
    s.ids[floor(random()*array_length(s.ids,1)+1)]
FROM o, s,
generate_series(1, array_length((SELECT array_agg(object_id) FROM Objects),1)) i;

INSERT INTO Treatment_Step_Log (
    treatment_id, step_number, step_description, observations, 
    timestamp_performed, performed_by_user, researcher_access_id
)
SELECT 
    st_treatment.ids[floor(random()*array_length(st_treatment.ids,1)+1)],
    floor(random()*5+1),
    (ARRAY['Инспекција', 'Чистење', 'Конзервација', 'Документација', 'Проверка'])[floor(random()*5+1)], -- Сигурен избор без NULL
    CASE WHEN random() < 0.5 THEN 'Процесот помина во најдобар ред.' ELSE 'Забележани ситни нечистотии.' END,
    NOW() - (random() * interval '30 days'),
    u.ids[floor(random() * array_length(u.ids, 1) + 1)],
    ra.ids[floor(random() * array_length(ra.ids, 1) + 1)]
FROM generate_series(1, 7000000)
CROSS JOIN (SELECT array_agg(user_id) AS ids FROM Users) u
CROSS JOIN (SELECT array_agg(access_id) AS ids FROM Researcher_Access) ra
CROSS JOIN (SELECT array_agg(treatment_id) AS ids FROM Treatments) st_treatment
on conflict do nothing;

WITH obj AS (
    SELECT array_agg(object_id) AS oids FROM Objects
)
INSERT INTO Object_Images (
    image_url, 
    object_id, 
    description, 
    date_taken, 
    is_primary
)
SELECT 
    'http://img/object_' || selected_id || '_' || i, 
    selected_id,
    CASE 
        WHEN i % 3 = 0 THEN 'Поглед од предна страна'
        WHEN i % 3 = 1 THEN 'Детален приказ на текстура'
        ELSE 'Профилна снимка на предметот'
    END,
    CURRENT_DATE - (random() * 730)::int,
    (random() < 0.15) 
FROM (
    SELECT 
        obj.oids[floor(random() * array_length(obj.oids, 1) + 1)] AS selected_id,
        i
    FROM obj, generate_series(1, 1000000) i
) subquery;

INSERT INTO Researcher_Access (
    access_date,
    access_status_id,
    user_id,
    object_id,
    institution_id,
    conservation_project_id
)
SELECT 
    CURRENT_DATE - (floor(random()*1200))::int,
    st_arr.ids[floor(random() * array_length(st_arr.ids, 1) + 1)],
    u_arr.ids[floor(random() * array_length(u_arr.ids, 1) + 1)],
    o_arr.ids[floor(random() * array_length(o_arr.ids, 1) + 1)],
    i_arr.ids[floor(random() * array_length(i_arr.ids, 1) + 1)],
    CASE 
        WHEN random() < 0.6 THEN p_arr.ids[floor(random() * array_length(p_arr.ids, 1) + 1)]
        ELSE NULL 
    END
FROM 
    (SELECT array_agg(status_id) AS ids FROM Status_Types WHERE type = 'access') st_arr,
    (SELECT array_agg(user_id) AS ids FROM Users) u_arr,
    (SELECT array_agg(object_id) AS ids FROM Objects) o_arr,
    (SELECT array_agg(institution_id) AS ids FROM Institutions) i_arr,
    (SELECT array_agg(project_id) AS ids FROM Conservation_Projects) p_arr,
    generate_series(1, 500000) AS s;

INSERT INTO Exhibitions (start_date, end_date, name, location_institution_id)
SELECT 
    base_date,
    CASE 
        WHEN random() < 0.7 
        THEN base_date + (floor(random()*1500))::int 
        ELSE NULL 
    END,
    CASE (i % 8)
        WHEN 0 THEN 'Праисториска Македонија'
        WHEN 1 THEN 'Античка Македонија'
        WHEN 2 THEN 'Римски период'
        WHEN 3 THEN 'Византија'
        WHEN 4 THEN 'Среден век'
        WHEN 5 THEN 'Османлиски период'
        WHEN 6 THEN 'Археологија'
        ELSE 'Модерна уметност'
    END || ' - Изложба ' || i,
    inst_arr.ids[floor(random() * array_length(inst_arr.ids, 1) + 1)]
FROM generate_series(1, 5000) i
CROSS JOIN (
    SELECT array_agg(institution_id) AS ids FROM Institutions
) inst_arr
CROSS JOIN LATERAL (
    SELECT CURRENT_DATE - (floor(random()*4000+i*0))::int AS base_date
) d;

INSERT INTO Exhibition_Object_Details (
    display_title,
    exhibition_description,
    language,
    object_id,
    exhibition_id
)
SELECT 
    'Објект во изложба ' || gs,

    CASE 
        WHEN random() < 0.3 THEN 'Археолошки наод'
        WHEN random() < 0.6 THEN 'Музејски предмет'
        ELSE 'Културно наследство'
    END,

    CASE WHEN random() < 0.5 THEN 'mk' ELSE 'en' END,

    o.object_id,
    e.exhibition_id

FROM generate_series(1, 10000) gs

JOIN LATERAL (
    SELECT object_id
    FROM Objects
    ORDER BY object_id
    OFFSET (gs % (SELECT COUNT(*) FROM Objects))
    LIMIT 1
) o ON true

JOIN LATERAL (
    SELECT exhibition_id
    FROM Exhibitions
    ORDER BY exhibition_id
    OFFSET (gs % (SELECT COUNT(*) FROM Exhibitions))
    LIMIT 1
) e ON true;

INSERT INTO Object_Classification (
    object_id, 
    category_id, 
    culture_id, 
    period_descr, 
    style, 
    iconography
)
SELECT 
    o.object_id,
    cat.ids[floor(random() * array_length(cat.ids, 1) + 1)],
    cul.ids[floor(random() * array_length(cul.ids, 1) + 1)],
    (ARRAY['Ран неолит', 'Доцна антика', 'Среден век', 'Бронзено доба', 'Хеленистички период'])[floor(random() * 5 + 1)],
    (ARRAY['Доричен', 'Јонски', 'Византиски', 'Локален стил', 'Барок'])[floor(random() * 5 + 1)],
    (ARRAY['Религиозни мотиви', 'Геометриски фигури', 'Животински приказ', 'Растителни орнаменти'])[floor(random() * 4 + 1)]
FROM Objects o
CROSS JOIN (SELECT array_agg(category_id) AS ids FROM Categories) cat
CROSS JOIN (SELECT array_agg(culture_id) AS ids FROM Culture) cul
ON CONFLICT DO NOTHING;

INSERT INTO Object_Exhibition (object_id, exhibition_id)
SELECT 
    o.object_id,
    ex.ids[floor(random() * array_length(ex.ids, 1) + 1)]
FROM (
    SELECT object_id FROM Objects 
    LIMIT 500000
) o
CROSS JOIN (
    SELECT array_agg(exhibition_id) AS ids FROM Exhibitions
) ex
ON CONFLICT DO NOTHING;

INSERT INTO Object_Location_History (
    object_id, 
    institution_id, 
    start_date, 
    end_date
)
SELECT 
    o.object_id,
    inst.ids[floor(random() * array_length(inst.ids, 1) + 1)],
    start_d,
    CASE 
        WHEN random() < 0.7 
        THEN start_d + (random() * 500)::int
        ELSE NULL
    END
FROM (
    SELECT 
        object_id, 
        CURRENT_DATE - (random() * 3000)::int AS start_d 
    FROM Objects
) o
CROSS JOIN (
    SELECT array_agg(institution_id) AS ids FROM Institutions
) inst
ON CONFLICT DO NOTHING;

INSERT INTO Object_Publication (
    object_id,
    publication_id,
    page_reference,
    notes
)
SELECT 
    o.object_id,
    p.ids[floor(random() * array_length(p.ids, 1) + 1)],
    'p.' || floor(random() * 500 + 1)::text,
    'Археолошка публикација'
FROM (
    SELECT object_id FROM Objects LIMIT 200000
) o
CROSS JOIN (
    SELECT array_agg(publication_id) AS ids FROM Publications
) p
ON CONFLICT DO NOTHING;

INSERT INTO Publication_Authors (publication_id, author_id)
SELECT 
    p.publication_id,
    a.ids[floor(random()*array_length(a.ids,1)+1)]
FROM Publications p
CROSS JOIN(SELECT array_agg(author_id) as ids FROM Authors)a
LIMIT 200000;

INSERT INTO Treatment_Materials (treatment_id, material_id)
SELECT 
    t.treatment_id,
    COALESCE(
        CASE 
            WHEN o.title ILIKE '%керами%' OR o.title ILIKE '%сад%' 
                 THEN (SELECT material_id FROM Materials WHERE name = 'Керамика' LIMIT 1)
            WHEN o.title ILIKE '%бронз%' OR o.title ILIKE '%фибул%' 
                 THEN (SELECT material_id FROM Materials WHERE name = 'Бронза' LIMIT 1)
            WHEN o.title ILIKE '%желез%' OR o.title ILIKE '%меч%' OR o.title ILIKE '%нож%' 
                 THEN (SELECT material_id FROM Materials WHERE name = 'Железо' LIMIT 1)
            WHEN o.title ILIKE '%монета%' OR o.title ILIKE '%пари%' 
                 THEN (SELECT material_id FROM Materials WHERE name IN ('Сребро', 'Злато', 'Бронза') ORDER BY random() LIMIT 1)
            WHEN o.title ILIKE '%камен%' OR o.title ILIKE '%стату%' 
                 THEN (SELECT material_id FROM Materials WHERE name = 'Камен' LIMIT 1)
        END,
        m_list.ids[floor(random() * array_length(m_list.ids, 1) + 1)]
    )
FROM (
    SELECT treatment_id, object_id FROM Treatments LIMIT 1000000
) t
JOIN Objects o ON o.object_id = t.object_id
CROSS JOIN (
    SELECT array_agg(material_id) AS ids FROM Materials
) m_list
ON CONFLICT DO NOTHING;
