/* Unique Ids sequence generator */

drop sequence SEQ_GEN_SEQUENCE;
create sequence SEQ_GEN_SEQUENCE START WITH 1000 INCREMENT BY 50;


DROP TABLE IF EXISTS GROUP_ CASCADE;
CREATE TABLE GROUP_ (
    id bigint NOT NULL PRIMARY KEY,
    groupName varchar(255) NOT NULL
);

DROP TABLE IF EXISTS USERGROUP CASCADE;
CREATE TABLE USERGROUP (
    id bigint NOT NULL PRIMARY KEY,
    groupId bigint references GROUP_(id) on delete cascade,
    userId bigint references USERS(id)  on delete cascade
);
create index usergroup_groupId_idx ON USERGROUP(groupId);

DROP TABLE IF EXISTS GROUPPERMISSIONS CASCADE;
CREATE TABLE GROUPPERMISSIONS (
    id bigint NOT NULL PRIMARY KEY,
    groupId bigint references GROUP_(id),
    serviceName varchar(255) not null,
    methodIndex int not null
);

/* METADATA */

DROP TABLE IF EXISTS attribute_group CASCADE;
CREATE TABLE attribute_group (
    id bigint NOT NULL PRIMARY KEY
);

DROP TABLE IF EXISTS attribute CASCADE;
CREATE TABLE attribute (
    id bigint NOT NULL PRIMARY KEY,
    name varchar(255),
    type varchar(255),
    value varchar(255),
    attribute_group_id bigint REFERENCES attribute_group (id),
    mandatory boolean
);

/* DATA */

DROP TABLE IF EXISTS gde_file CASCADE;
CREATE TABLE gde_file (
    id bigint NOT NULL PRIMARY KEY,
    name varchar(255),
    length bigint,
    checksum varchar(255),
    creation_date timestamp,
    update_date timestamp,
    valid boolean,
    deleted boolean,
    deletion_date timestamp,
    attribute_group_id bigint REFERENCES attribute_group (id),
    data_profile_id bigint REFERENCES profile (id)
);

DROP TABLE IF EXISTS chunk CASCADE;
CREATE TABLE chunk (
    id bigint NOT NULL PRIMARY KEY,
    file_id bigint NOT NULL REFERENCES gde_file (id),
    rank bigint,
    checksum varchar(255),
    size bigint,
    data bytea
);

/* STUDIES */

DROP TABLE IF EXISTS study CASCADE;
CREATE TABLE study (
    id bigint NOT NULL PRIMARY KEY,
    name varchar(255),
    creation_date timestamp,
    update_date timestamp,
    valid boolean,
    deleted boolean,
    deletion_date timestamp,
    attribute_group_id bigint REFERENCES attribute_group (id),
    profile_id bigint REFERENCES profile (id)
);

/* PROFILES */

DROP TABLE IF EXISTS profile CASCADE;
CREATE TABLE profile (
    id bigint NOT NULL PRIMARY KEY,
    name varchar(255)
);

DROP TABLE IF EXISTS profile_attribute CASCADE;
CREATE TABLE profile_attribute (
    id bigint NOT NULL PRIMARY KEY,
    name varchar(255),
    type varchar(255),
    mandatory boolean,
    profile_id bigint REFERENCES profile (id)
);
INSERT INTO group_ (id,groupname) VALUES (1,'admins');
INSERT into usergroup(id,groupid,userid) VALUES (2,1,1);
INSERT INTO grouppermissions (id,groupid,servicename,methodname) VALUES (3, 1, 'UserService','CREATEUSER');
