create schema if not exists log;

-- DROP TABLE IF EXISTS log.table_changes cascade;
CREATE TABLE IF NOT EXISTS log.table_changes();
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS change_id text NOT NULL DEFAULT next_id();
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS change_type text;
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS change_date date;
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS change_user_id text;
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS entity_type text; -- table_name
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS entity_id text; -- object_id
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS uid text;
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS cdate timestamp without time zone DEFAULT (now())::timestamp without time zone;
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS editor_id text;
ALTER TABLE log.table_changes ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;

-- DROP TABLE IF EXISTS log.table_changes_data;
CREATE TABLE IF NOT EXISTS log.table_changes_data();
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS change_data_id text NOT NULL DEFAULT next_id();
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS change_id text not null;
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS entity_key text; -- column_name
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS value_old text;
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS value_new text;
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS value_hash text;
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS uid text;
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS cdate timestamp without time zone DEFAULT (now())::timestamp without time zone;
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS editor_id text;
ALTER TABLE log.table_changes_data ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;

-- DROP TABLE IF EXISTS log.user_auth;
CREATE TABLE IF NOT EXISTS log.user_auth();
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS user_auth_id text NOT NULL DEFAULT next_id();
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS user_id text;
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS auth_date timestamp without time zone;
ALTER TABLE log.user_auth ALTER COLUMN auth_date SET DEFAULT (now())::timestamp without time zone;
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS auth_type text;
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS uid text;
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS cdate timestamp without time zone DEFAULT (now())::timestamp without time zone;
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS editor_id text;
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS auth_data json;
ALTER TABLE log.user_auth ADD COLUMN IF NOT EXISTS ip text;

COMMENT ON TABLE log.table_changes IS 'Логи подій змін в БД';
COMMENT ON COLUMN log.table_changes.change_type IS 'Тип події (insert / update / delete)';
COMMENT ON COLUMN log.table_changes.change_date IS 'Дата внесення змін до БД';
COMMENT ON COLUMN log.table_changes.entity_type IS 'Таблиця, до якої вносяться зміни';
COMMENT ON COLUMN log.table_changes.entity_id IS 'ID строки, до якої вносяться зміни';
COMMENT ON COLUMN log.table_changes.change_user_id IS 'Ініціатор внесення змін';

COMMENT ON TABLE log.table_changes_data IS 'Логи змін в таблицях БД';
COMMENT ON COLUMN log.table_changes_data.change_id IS 'ID події зміни в БД';
COMMENT ON COLUMN log.table_changes_data.entity_key IS 'Колонка таблиці, до якої вносяться зміни';
COMMENT ON COLUMN log.table_changes_data.value_old IS 'Старе значення';
COMMENT ON COLUMN log.table_changes_data.value_new IS 'Нове значення';

COMMENT ON TABLE log.user_auth IS 'Логи авторизації';
COMMENT ON COLUMN log.user_auth.user_id IS 'ID користувача';
COMMENT ON COLUMN log.user_auth.auth_date IS 'Дата авторизації';
COMMENT ON COLUMN log.user_auth.auth_type IS 'Тип авторизації';
COMMENT ON COLUMN log.user_auth.auth_data IS 'Дані про користувача';
COMMENT ON COLUMN log.user_auth.ip IS 'IP адреса користувача';

ALTER TABLE log.table_changes DROP CONSTRAINT IF EXISTS log_table_changes_pkey cascade;
ALTER TABLE log.table_changes_data DROP CONSTRAINT IF EXISTS log_table_changes_data_pkey;
ALTER TABLE log.table_changes_data DROP CONSTRAINT IF EXISTS log_table_changes_data_change_id_fkey;
ALTER TABLE log.user_auth DROP CONSTRAINT IF EXISTS log_user_auth_pkey;
ALTER TABLE log.user_auth DROP CONSTRAINT IF EXISTS log_user_auth_user_id_fkey;

ALTER TABLE log.table_changes ADD CONSTRAINT log_table_changes_pkey PRIMARY KEY (change_id);
ALTER TABLE log.table_changes_data ADD CONSTRAINT log_table_changes_data_pkey PRIMARY KEY (change_data_id);
ALTER TABLE log.table_changes_data ADD CONSTRAINT log_table_changes_data_change_id_fkey FOREIGN KEY (change_id)
REFERENCES log.table_changes (change_id);
ALTER TABLE log.user_auth ADD CONSTRAINT log_user_auth_pkey PRIMARY KEY (user_auth_id);
-- ALTER TABLE log.user_auth ADD CONSTRAINT log_user_auth_user_id_fkey FOREIGN KEY (user_id) REFERENCES admin.users (uid) MATCH SIMPLE;

/* drop old columns */
alter table log.table_changes drop column if exists date_new;
alter table log.table_changes drop column if exists date_old;
alter table log.table_changes drop column if exists number_new;
alter table log.table_changes drop column if exists number_old;
alter table log.table_changes drop column if exists json_new;
alter table log.table_changes drop column if exists json_old;
alter table log.table_changes drop column if exists text_new;
alter table log.table_changes drop column if exists text_old;
alter table log.table_changes drop column if exists bool_new;
alter table log.table_changes drop column if exists bool_old;
alter table log.table_changes drop column if exists table_change_id;