
CREATE DATABASE IF NOT EXISTS CMSCHEDULER;
USE CMSCHEDULER;

CREATE TABLE IF NOT EXISTS DOMAINS (
    domain VARCHAR(256) NOT NULL,
    CONSTRAINT PK_DOMAINS PRIMARY KEY (domain)
)  ENGINE=INNODB;

CREATE UNIQUE INDEX DOMAIN_UNIQUE ON DOMAINS (domain ASC);


-- -----------------------------------------------------
-- Table SCHEDULES
-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS SCHEDULES (
    id INT NOT NULL AUTO_INCREMENT,
    domain VARCHAR(256) NOT NULL,
    schedule_id VARCHAR(256) NULL,
    schedule_name VARCHAR(256) NULL,
    user_id VARCHAR(45) NULL,
    status VARCHAR(45) NOT NULL,
    create_date_time BIGINT NULL,
    schedule_info MEDIUMTEXT NOT NULL,
    schedule MEDIUMTEXT NULL,
    optimizer_status VARCHAR(45) NULL,
    optimizer_message MEDIUMTEXT NULL,
    optimizer_date_time BIGINT NULL,
    optimizer_return_date_time BIGINT NULL,
    optimizer_attempts_to_schedule INT NOT NULL DEFAULT 0,
    optimizer_transaction_id VARCHAR(128) NULL,
    delete_date_time BIGINT NULL,
    CONSTRAINT PK_SCHEDULES PRIMARY KEY (id),
    CONSTRAINT FK_SCHEDULES_DOMAIN FOREIGN KEY (domain)
        REFERENCES DOMAINS (domain)
        ON DELETE NO ACTION ON UPDATE CASCADE
)  ENGINE=INNODB;
CREATE UNIQUE INDEX SCHEDULE_KEY ON SCHEDULES (domain ASC, schedule_id ASC);

CREATE UNIQUE INDEX OPTIMIZER_TRANSACTION_ID_UNIQUE ON SCHEDULES (optimizer_transaction_id ASC);


-- -----------------------------------------------------
-- Table SCHEDULE_EVENTS
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS SCHEDULE_EVENTS (
    id INT(11) NOT NULL AUTO_INCREMENT,
    schedules_id INT(11) NOT NULL,
    event_time BIGINT(20) NOT NULL,
    reminder_time BIGINT(20) NOT NULL,
    domain VARCHAR(45) NULL DEFAULT NULL,
    event_text MEDIUMTEXT NULL DEFAULT NULL,
    status VARCHAR(45) NULL DEFAULT NULL,
    CONSTRAINT PK_SCHEDULE_EVENTS PRIMARY KEY (id),
    CONSTRAINT FK_SCHEDULE_EVENTS_SCHEDULES FOREIGN KEY (schedules_id)
        REFERENCES SCHEDULES (id)
        ON DELETE NO ACTION ON UPDATE NO ACTION
)  ENGINE=INNODB;

CREATE INDEX FK_SCHEDULE_EVENTS_SCHEDULES_IDX ON SCHEDULE_EVENTS (schedules_id ASC);

CREATE INDEX SEQ_SVENTS ON SCHEDULE_EVENTS (reminder_time ASC);



-- -----------------------------------------------------
-- Table DOMAIN_DATA
-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS DOMAIN_DATA (
    id INT NOT NULL AUTO_INCREMENT,
    schedules_id INT NOT NULL,
    name VARCHAR(128) NULL,
    value MEDIUMTEXT NULL,
    CONSTRAINT PK_DOMAIN_DATA PRIMARY KEY (id),
    CONSTRAINT FK_DOMAIN_DATA_SCHEDULES FOREIGN KEY (schedules_id)
        REFERENCES SCHEDULES (id)
        ON DELETE NO ACTION ON UPDATE NO ACTION
)  ENGINE=INNODB;

CREATE UNIQUE INDEX ID_UNIQUE ON DOMAIN_DATA (id ASC);

CREATE INDEX FK_DOMAIN_DATA_SCHEDULES_IDX ON DOMAIN_DATA (schedules_id ASC);


-- -----------------------------------------------------
-- Table APPROVAL_TYPES
-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS APPROVAL_TYPES (
    id INT NOT NULL AUTO_INCREMENT,
    domain VARCHAR(256) NOT NULL,
    approval_type VARCHAR(45) NOT NULL,
    approval_count INT NOT NULL DEFAULT 1,
    CONSTRAINT PK_APPROVAL_TYPES PRIMARY KEY (id),
    CONSTRAINT FK_APPROVAL_TYPES_DOMAIN FOREIGN KEY (domain)
        REFERENCES DOMAINS (domain)
        ON DELETE NO ACTION ON UPDATE CASCADE
)  ENGINE=INNODB; 
CREATE INDEX FK_DOMAIN_IDX ON APPROVAL_TYPES (domain ASC);


-- -----------------------------------------------------
-- Table SCHEDULE_APPROVALS
-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS SCHEDULE_APPROVALS (
    id INT NOT NULL AUTO_INCREMENT,
    schedules_id INT NOT NULL,
    user_id VARCHAR(45) NOT NULL,
    approval_type_id INT NOT NULL,
    status VARCHAR(45) NOT NULL DEFAULT 'Pending Approval',
    approval_date_time BIGINT NULL,
    CONSTRAINT PK_SCHEDULE_APPROVALS PRIMARY KEY (id),
    CONSTRAINT FK_SCHEDULE_APPROVALS_SCHEDULES FOREIGN KEY (schedules_id)
        REFERENCES SCHEDULES (id)
        ON DELETE NO ACTION ON UPDATE NO ACTION,
    CONSTRAINT FK_SCHEDULE_APPROVALS_APPROVAL_TYPES FOREIGN KEY (approval_type_id)
        REFERENCES APPROVAL_TYPES (id)
        ON DELETE NO ACTION ON UPDATE NO ACTION
)  ENGINE=INNODB;

CREATE INDEX FK_SCHEDULE_APPROVALS_SCHEDULES_IDX ON SCHEDULE_APPROVALS (schedules_id ASC);

CREATE INDEX FK_APPROVAL_TYPES_IDX ON SCHEDULE_APPROVALS (approval_type_id ASC);


-- -----------------------------------------------------
-- Table CHANGE_MANAGEMENT_GROUPS
-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS CHANGE_MANAGEMENT_GROUPS (
    id INT NOT NULL AUTO_INCREMENT,
    group_id VARCHAR(45) NULL,
    schedules_id INT NULL,
    start_time BIGINT NULL,
    finish_time BIGINT NULL,
    last_instance_start_time BIGINT NULL,
    normal_duration_in_secs INT NULL,
    additional_duration_in_secs INT NULL,
    concurrency_limit INT NULL,
    policy_id VARCHAR(256) NULL,
    CONSTRAINT PK_CHANGE_MANAGEMENT_GROUPS PRIMARY KEY (id),
    CONSTRAINT FK_CHANGE_MANAGEMENT_GROUPS_SCHEDULES FOREIGN KEY (schedules_id)
        REFERENCES SCHEDULES (id)
        ON DELETE NO ACTION ON UPDATE NO ACTION
)  ENGINE=INNODB;

CREATE INDEX FK_SCHEDULES_IDX ON CHANGE_MANAGEMENT_GROUPS (schedules_id ASC);

CREATE UNIQUE INDEX CHANGE_MANAGEMENT_GROUP_ID_UNIQUE ON CHANGE_MANAGEMENT_GROUPS (schedules_id ASC, group_id ASC);


-- -----------------------------------------------------
-- Table CHANGE_MANAGEMENT_SCHEDULES
-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS CHANGE_MANAGEMENT_SCHEDULES (
    id INT NOT NULL AUTO_INCREMENT,
    change_management_groups_id INT NULL,
    vnf_name VARCHAR(256) NOT NULL,
    vnf_id VARCHAR(256) NULL,
    status VARCHAR(45) NOT NULL,
    start_time BIGINT NULL,
    finish_time BIGINT NULL,
    mso_request_id VARCHAR(45) NULL,
    mso_status VARCHAR(45) NULL,
    mso_message MEDIUMTEXT NULL,
    mso_time BIGINT NULL,
    dispatcher_instance VARCHAR(128) NULL,
    dispatch_time BIGINT NULL,
    execution_completed_time BIGINT NULL,
    status_message MEDIUMTEXT NULL,
    tm_change_id VARCHAR(15) NULL,
    tm_approval_status VARCHAR(45) NULL,
    tm_status VARCHAR(45) NULL,
    CONSTRAINT PK_CHANGE_MANAGEMENT_SCHEDULES PRIMARY KEY (id),
    CONSTRAINT FK_CHANGE_MANAGEMENT_SCHEDULES_CHANGE_MANAGEMENT_GROUP FOREIGN KEY (change_management_groups_id)
        REFERENCES CHANGE_MANAGEMENT_GROUPS (id)
        ON DELETE NO ACTION ON UPDATE NO ACTION
)  ENGINE=INNODB;

CREATE INDEX FK_CHANGE_MANAGEMENT_GROUP_CHANGE_MANAGEMENT_SCHEDULES_IDX ON CHANGE_MANAGEMENT_SCHEDULES (change_management_groups_id ASC);

CREATE UNIQUE INDEX CHANGE_MANAGEMENT_SCHEDULES_VNF_NAME_UNIQUE ON CHANGE_MANAGEMENT_SCHEDULES (change_management_groups_id ASC, vnf_name ASC);


-- -----------------------------------------------------
-- Table CHANGE_MANAGEMENT_CHANGE_WINDOWS
-- -----------------------------------------------------

CREATE TABLE IF NOT EXISTS CHANGE_MANAGEMENT_CHANGE_WINDOWS (
    id INT NOT NULL AUTO_INCREMENT,
    change_management_groups_id INT NOT NULL,
    start_time BIGINT NULL,
    finish_time BIGINT NULL,
    CONSTRAINT PK_CHANGE_MANAGEMENT_CHANGE_WINDOWS PRIMARY KEY (id),
    CONSTRAINT FK_CHANGE_WINDOWS_CHANGE_MANAGEMENT_GROUPS1 FOREIGN KEY (change_management_groups_id)
        REFERENCES CHANGE_MANAGEMENT_GROUPS (id)
        ON DELETE NO ACTION ON UPDATE NO ACTION
)  ENGINE=INNODB;

CREATE INDEX FK_CHANGE_WINDOWS_CHANGE_MANAGEMENT_GROUPS1_IDX on CHANGE_MANAGEMENT_CHANGE_WINDOWS (change_management_groups_id ASC);




-- comment SQL_SAFE_UPDATES code in dev setup (testing)
-- uncomment in IT, IST, E2E Env's 
SET SQL_SAFE_UPDATES = 0;

DELETE FROM DOMAINS;

INSERT INTO DOMAINS (`domain`) VALUES ('ChangeManagement');


DELETE FROM APPROVAL_TYPES;

INSERT INTO APPROVAL_TYPES (`domain`, `approval_type`, `approval_count`) VALUES ('ChangeManagement', 'Tier 2', '1');