<databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xsi:schemaLocation="
            http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <property name="consultationNumberLength" value="1024" dbms="postgresql,oracle"/>
    <property name="consultationNumberLength" value="255" dbms="mysql,mssql"/>

    <changeSet id="1-consultation-add-acm-consultation-table" author="vladimir.cherepnalkovski"
               dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_consultation">
            <column name="cm_consultation_id" type="${idType}">
                <constraints primaryKeyName="pk_acm_consultation" primaryKey="true"/>
            </column>
            <column name="cm_consultation_number" type="VARCHAR(${consultationNumberLength})">
                <constraints unique="true" uniqueConstraintName="uk_consultation_number" nullable="false"/>
            </column>
            <column name="cm_consultation_type" type="VARCHAR(4000)"/>
            <column name="cm_consultation_title" type="VARCHAR(4000)"/>
            <column name="cm_consultation_status" type="VARCHAR(4000)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_details" type="CLOB">
                <constraints nullable="true"/>
            </column>
            <column name="cm_consultation_details_summary" type="CLOB">
                <constraints nullable="true"/>
            </column>
            <column name="cm_consultation_created" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_modified" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_closed" type="DATE"/>
            <column name="cm_consultation_priority" type="VARCHAR(1024)"/>
            <column name="cm_consultation_external_flag" type="BOOLEAN" defaultValueBoolean="false">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_type" type="VARCHAR(100)" defaultValue="CONSULTATION">
                <constraints nullable="false"/>
            </column>
            <column name="cm_class_name" type="VARCHAR(400)"/>
            <column name="cm_due_date" type="${timestampType}">
                <constraints nullable="true"/>
            </column>
            <column name="cm_consultation_restricted_flag" type="VARCHAR(32)" defaultValue="false">
                <constraints nullable="false"/>
            </column>
            <column name="cm_container_id" type="${fkIdType}"/>
            <column name="cm_response_due_date" type="${timestampType}"/>
            <column name="cm_legacy_system_id" type="VARCHAR(255)"/>
            <column name="cm_received_date" type="${timestampType}"/>
        </createTable>
    </changeSet>

    <changeSet id="2-consultation-add-acm-consultation-table" author="vladimir.cherepnalkovski" dbms="mysql">
        <createTable tableName="acm_consultation">
            <column name="cm_consultation_id" type="${idType}">
                <constraints primaryKeyName="pk_acm_consultation" primaryKey="true"/>
            </column>
            <column name="cm_consultation_number" type="VARCHAR(${consultationNumberLength})">
                <constraints unique="true" uniqueConstraintName="uk_consultation_number" nullable="false"/>
            </column>
            <column name="cm_consultation_type" type="VARCHAR(4000)"/>
            <column name="cm_consultation_title" type="VARCHAR(4000)"/>
            <column name="cm_consultation_status" type="VARCHAR(4000)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_details" type="CLOB">
                <constraints nullable="true"/>
            </column>
            <column name="cm_consultation_details_summary" type="CLOB">
                <constraints nullable="true"/>
            </column>
            <column name="cm_consultation_created" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_modified" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_consultation_closed" type="DATE"/>
            <column name="cm_consultation_priority" type="VARCHAR(1024)"/>
            <column name="cm_consultation_external_flag" type="BOOLEAN" defaultValueBoolean="false">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_type" type="VARCHAR(100)" defaultValue="CONSULTATION">
                <constraints nullable="false"/>
            </column>
            <column name="cm_class_name" type="VARCHAR(400)"/>
            <column name="cm_due_date" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="true"/>
            </column>
            <column name="cm_consultation_restricted_flag" type="VARCHAR(32)" defaultValue="false">
                <constraints nullable="false"/>
            </column>
            <column name="cm_container_id" type="${fkIdType}"/>
            <column name="cm_response_due_date" type="${timestampType}" defaultValueComputed="${timestampFunction}"/>
            <column name="cm_legacy_system_id" type="VARCHAR(255)"/>
            <column name="cm_received_date" type="${timestampType}" defaultValueComputed="${timestampFunction}"/>
        </createTable>
    </changeSet>

    <changeSet id="3-consultation-add-acm_consultation-id" author="vladimir.cherepnalkovski">
        <createTable tableName="acm_consultation_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_consultation_id">
            <column name="cm_seq_num" value="100"/>
            <column name="cm_seq_name" value="acm_consultation"/>
        </insert>
    </changeSet>

    <changeSet id="4-create-index-column-title" author="vladimir.cherepnalkovski" dbms="oracle,postgresql,mssql">
        <createIndex tableName="acm_consultation" indexName="idx_consultation_title">
            <column name="cm_consultation_title"/>
        </createIndex>
    </changeSet>

    <changeSet id="5-create-index-column-title" author="vladimir.cherepnalkovski" dbms="mysql">
        <preConditions onFail="MARK_RAN">
            <not>
                <indexExists tableName="acm_consultation" columnNames="cm_consultation_title"/>
            </not>
        </preConditions>
        <createIndex tableName="acm_consultation" indexName="idx_consultation_title">
            <column name="cm_consultation_title (128)"/>
        </createIndex>
    </changeSet>

    <changeSet id="6-consultation-add-acm_change_consultation_status-id" author="vladimir.cherepnalkovski">
        <createTable tableName="acm_change_consultation_status_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_change_consultation_status_id">
            <column name="cm_seq_num" value="100"/>
            <column name="cm_seq_name" value="acm_change_consultation_status"/>
        </insert>
    </changeSet>

    <changeSet id="7-consultation-add-change-consultation-status-table" author="vladimir.cherepnalkovski"
               dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_change_consultation_status">
            <column name="cm_change_consultation_status_id" type="${idType}">
                <constraints primaryKeyName="pk_change_consultation_status" primaryKey="true"/>
            </column>
            <column name="cm_consultation_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_status" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_type" type="VARCHAR(100)" defaultValue="CHANGE_CONSULTATION_STATUS">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_created" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_modified" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_change_consultation_status" baseColumnNames="cm_consultation_id"
                                 constraintName="fk_change_consultation_status_consultation_id"
                                 referencedTableName="acm_consultation"
                                 referencedColumnNames="cm_consultation_id"
                                 deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="8-consultation-add-change-consultation-status-table" author="vladimir.cherepnalkovski" dbms="mysql">
        <createTable tableName="acm_change_consultation_status">
            <column name="cm_change_consultation_status_id" type="${idType}">
                <constraints primaryKeyName="pk_change_consultation_status" primaryKey="true"/>
            </column>
            <column name="cm_consultation_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_status" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_object_type" type="VARCHAR(100)" defaultValue="CHANGE_CONSULTATION_STATUS">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_created" type="${timestampType}"
                    defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_modified" type="${timestampType}"
                    defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_change_consultation_status_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_change_consultation_status" baseColumnNames="cm_consultation_id"
                                 constraintName="fk_change_consultation_status_consultation_id"
                                 referencedTableName="acm_consultation" referencedColumnNames="cm_consultation_id"
                                 deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="09-add-column-component-agency" author="stefan.sanevski" dbms="oracle,postgresql,mssql,mysql">
        <addColumn tableName="acm_consultation">
            <column name="cm_component_agency" type="VARCHAR(4000)">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="10-add-column-external-requesting-agency" author="stefan.sanevski" dbms="oracle,postgresql,mssql,mysql">
        <addColumn tableName="acm_consultation">
            <column name="cm_external_requesting_agency" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>
    
    <changeSet id="11-drop-not-null-on-component-agency" author="stefan.sanevski">
        <dropNotNullConstraint tableName="acm_consultation" columnName="cm_component_agency" columnDataType="VARCHAR(4000)"/>
    </changeSet>

    <changeSet id="12-change_cm_consultation_datetime" author="mario.gjurcheski" dbms="mysql">
        <modifyDataType tableName="acm_consultation" columnName="cm_consultation_created" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_consultation" columnName="cm_consultation_modified" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_consultation" columnName="cm_due_date" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_consultation" columnName="cm_response_due_date" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_consultation" columnName="cm_received_date" newDataType="DATETIME"/>
    </changeSet>

    <changeSet id="13-change_cm_change_consultation_status_datetime" author="mario.gjurcheski" dbms="mysql">
        <modifyDataType tableName="acm_change_consultation_status" columnName="cm_change_consultation_status_created"
            newDataType="DATETIME"/>
        <modifyDataType tableName="acm_change_consultation_status" columnName="cm_change_consultation_status_modified"
            newDataType="DATETIME"/>
    </changeSet>
</databaseChangeLog>