/* Unique Ids sequence generator */

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


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

CREATE TABLE USERS (
    id bigint NOT NULL PRIMARY KEY,
    userName varchar(255) not null,
    userpassword varchar(255) not null
);
CREATE INDEX users_username_index ON USERS(userName);

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);



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

/* METADATA */

CREATE TABLE attribute_group (
    id bigint NOT NULL PRIMARY KEY
);

CREATE TABLE attribute (
    id bigint NOT NULL PRIMARY KEY,
    name varchar(255),
    type varchar(255),
    value varchar(255),
    attribute_group_id bigint not null REFERENCES attribute_group (id)  on delete cascade on update cascade,
    mandatory boolean
);

/* PROFILE */

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

CREATE TABLE profile_attribute (
    id bigint NOT NULL PRIMARY KEY,
    name varchar(255),
    type varchar(255),
    mandatory boolean,
    profile_id bigint not null REFERENCES profile (id) on delete cascade on update cascade
);

/* DATA */

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)
);

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 */

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),
    locked boolean,
    lock_owner bigint references users(id)
);
/* PROFILES */


-- The 1000 first ids are reserved for initial data
INSERT INTO users (id,username,userpassword) VALUES (1,'admin','edf123');
INSERT INTO group_ (id,groupname) VALUES (1,'admins');
INSERT into usergroup(id,groupid,userid) VALUES (2,1,1);
INSERT INTO GROUPPERMISSIONS (id,groupid,servicename,methodindex) VALUES (3, 1, 'UserService',1); -- Create user 
INSERT INTO GROUPPERMISSIONS (id,groupid,servicename,methodindex) VALUES (4, 1, 'UserService',2); -- Delete user
INSERT INTO GROUPPERMISSIONS (id,groupid,servicename,methodindex) VALUES (5, 1, 'UserService',3); -- Add to group
INSERT INTO GROUPPERMISSIONS (id,groupid,servicename,methodindex) VALUES (6, 1, 'UserService',4); -- Remove from group
INSERT INTO GROUPPERMISSIONS (id,groupid,servicename,methodindex) VALUES (7, 1, 'UserService',5); -- Create group
INSERT INTO GROUPPERMISSIONS (id,groupid,servicename,methodindex) VALUES (8, 1, 'UserService',6); -- Delete group
INSERT INTO GROUPPERMISSIONS (id,groupid,servicename,methodindex) VALUES (9, 1, 'UserService',7); -- Find user
INSERT INTO GROUPPERMISSIONS (id,groupid,servicename,methodindex) VALUES (10, 1, 'UserService',8); -- Find group

 
