<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
            http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <property name="complaintNumberLength" value="1024" dbms="postgresql,oracle"/>
    <property name="complaintNumberLength" value="255" dbms="mysql,mssql"/>

    <property name="cmValueLength" value="4000" dbms="postgresql,oracle"/>
    <property name="cmValueLength" value="255" dbms="mysql,mssql"/>

    <property name="cmOrderLength" value="NUMBER(32,0)" dbms="postgresql,oracle"/>
    <property name="cmOrderLength" value="BIGINT" dbms="mysql,mssql"/>

    <changeSet id="01-create-complaint-table" author="dmiller" dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_complaint">
            <column name="cm_complaint_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_complaint"/>
            </column>
            <column name="cm_complaint_status" type="VARCHAR(128)" defaultValue="DRAFT">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_created" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_number" type="VARCHAR(${complaintNumberLength})">
                <constraints nullable="false" unique="true" uniqueConstraintName="uk_complaint_number"/>
            </column>
            <column name="cm_complaint_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_modified" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_type" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_title" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_details" type="CLOB">
                <constraints nullable="false"/>
            </column>
            <column name="cm_originator_id" type="${fkIdType}">
                <constraints nullable="true"/>
            </column>
            <column name="cm_target_name" type="VARCHAR(1024)">
                <constraints nullable="true"/>
            </column>
            <column name="cm_complaint_incident_date" type="${timestampType}">
                <constraints nullable="true"/>
            </column>
            <column name="cm_complaint_priority" type="VARCHAR(128)">
                <constraints nullable="false"/>
            </column>
        </createTable>

        <createIndex tableName="acm_complaint" indexName="idx_complaint_originator_id">
            <column name="cm_originator_id"/>
        </createIndex>

    </changeSet>

    <changeSet id="01-create-complaint-table" author="dmiller" dbms="mysql">
        <createTable tableName="acm_complaint">
            <column name="cm_complaint_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_complaint"/>
            </column>
            <column name="cm_complaint_status" type="VARCHAR(128)" defaultValue="DRAFT">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_created" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_number" type="VARCHAR(${complaintNumberLength})">
                <constraints nullable="false" unique="true" uniqueConstraintName="uk_complaint_number"/>
            </column>
            <column name="cm_complaint_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_modified" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_type" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_title" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_complaint_details" type="CLOB">
                <constraints nullable="false"/>
            </column>
            <column name="cm_originator_id" type="${fkIdType}">
                <constraints nullable="true"/>
            </column>
            <column name="cm_target_name" type="VARCHAR(1024)">
                <constraints nullable="true"/>
            </column>
            <column name="cm_complaint_incident_date" type="${timestampType}">
                <constraints nullable="true"/>
            </column>
            <column name="cm_complaint_priority" type="VARCHAR(128)">
                <constraints nullable="false"/>
            </column>
        </createTable>

        <createIndex tableName="acm_complaint" indexName="idx_complaint_originator_id">
            <column name="cm_originator_id"/>
        </createIndex>

    </changeSet>

    <changeSet id="02-complaint-switch-to-sequence-pk" author="dmiller" dbms="${excludeMSSQL}">
        <dropDefaultValue tableName="acm_complaint" columnName="cm_complaint_id"/>
        <modifyDataType tableName="acm_complaint" columnName="cm_complaint_id" newDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="02-1-complaint-switch-to-sequence-pk-mssql" author="riste.tutureski" dbms="mssql" failOnError="false">
        <dropDefaultValue tableName="acm_complaint" columnName="cm_complaint_id"/>
    </changeSet>

    <changeSet id="02-2-complaint-switch-to-sequence-pk-mssql" author="riste.tutureski" dbms="mssql">
        <dropPrimaryKey tableName="acm_complaint" constraintName="pk_complaint"/>
    </changeSet>

    <changeSet id="02-3-complaint-switch-to-sequence-pk-mssql" author="riste.tutureski" dbms="mssql">
        <modifyDataType tableName="acm_complaint" columnName="cm_complaint_id" newDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="02-4-complaint-switch-to-sequence-pk-mssql" author="riste.tutureski" dbms="mssql">
        <addNotNullConstraint tableName="acm_complaint" columnName="cm_complaint_id" columnDataType="${fkIdType}"/>
        <addPrimaryKey tableName="acm_complaint" columnNames="cm_complaint_id" constraintName="pk_complaint"/>
    </changeSet>

    <changeSet id="04-fix-originator-id-type" author="dmiller">
        <modifyDataType tableName="acm_complaint" columnName="cm_originator_id" newDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="05-drop-target-name-column" author="dmiller">
        <dropColumn tableName="acm_complaint" columnName="cm_target_name"/>
    </changeSet>

    <changeSet id="06-make-details-nullable" author="dmiller">
        <dropNotNullConstraint tableName="acm_complaint" columnName="cm_complaint_details" columnDataType="CLOB"/>
    </changeSet>

    <changeSet id="07-add-ecm-folder-id" author="dmiller">
        <addColumn tableName="acm_complaint">
            <column name="cm_complaint_ecm_folder_id" type="VARCHAR(1024)"/>
        </addColumn>
        <createIndex tableName="acm_complaint" indexName="idx_complaint_folder_id">
            <column name="cm_complaint_ecm_folder_id"/>
        </createIndex>
    </changeSet>

    <changeSet id="08-drop-not-null-on-priority-type-title" author="dmiller">
        <comment>Allow creating complaint with minimal data. These columns must be populated before it can be approved.</comment>
        <dropNotNullConstraint tableName="acm_complaint" columnName="cm_complaint_type" columnDataType="VARCHAR(1024)"/>
        <dropNotNullConstraint tableName="acm_complaint" columnName="cm_complaint_priority" columnDataType="VARCHAR(128)"/>
        <dropNotNullConstraint tableName="acm_complaint" columnName="cm_complaint_title" columnDataType="VARCHAR(1024)"/>
    </changeSet>

    <changeSet id="10-index-complaint-last-updated" author="dmiller">
        <createIndex tableName="acm_complaint" indexName="idx_complaint_modified">
            <column name="cm_complaint_modified"/>
        </createIndex>
    </changeSet>

    <changeSet id="11-insert-dueDate-in-complaint" author="tsedalu">
        <addColumn tableName="acm_complaint">
            <column name="cm_due_date" type="${timestampType}"/>
        </addColumn>
    </changeSet>

    <changeSet id="12-add-fields-in-acm-complaint-table" author="tsedalu">
        <addColumn tableName="acm_complaint">
            <column name="cm_tag" type="VARCHAR(1024)"/>
            <column name="cm_frequency" type="VARCHAR(1024)"/>
            <column name="cm_location" type="VARCHAR(1024)"/>
        </addColumn>
    </changeSet>

    <changeSet id="complaint-13-add-disposition-column" author="dmiller">
        <addColumn tableName="acm_complaint">
            <column name="cm_disposition_id" type="${fkIdType}"/>
        </addColumn>
    </changeSet>

    <changeSet id="complaint-14-add-close-complaint-request-table" author="dmiller" dbms="oracle,postgresql,mssql">
        <createTable tableName="acm_close_complaint_request">
            <column name="cm_close_complaint_id" type="${idType}">
                <constraints primaryKeyName="pk_close_complaint_request" primaryKey="true"/>
            </column>
            <column name="cm_complaint_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_disposition_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_status" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_created" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_modified" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_close_complaint_request" baseColumnNames="cm_complaint_id"
            constraintName="fk_close_complaint_cmplnt_id" referencedTableName="acm_complaint" referencedColumnNames="cm_complaint_id"
            deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="complaint-14-add-close-complaint-request-table" author="dmiller" dbms="mysql">
        <createTable tableName="acm_close_complaint_request">
            <column name="cm_close_complaint_id" type="${idType}">
                <constraints primaryKeyName="pk_close_complaint_request" primaryKey="true"/>
            </column>
            <column name="cm_complaint_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_disposition_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_status" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_created" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_creator" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_modified" type="${timestampType}" defaultValueComputed="${timestampFunction}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_close_complaint_modifier" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <addForeignKeyConstraint baseTableName="acm_close_complaint_request" baseColumnNames="cm_complaint_id"
            constraintName="fk_close_complaint_cmplnt_id" referencedTableName="acm_complaint" referencedColumnNames="cm_complaint_id"
            deferrable="${deferrable}" initiallyDeferred="${initially.deferred}"/>
    </changeSet>

    <changeSet id="complaint-15-change-location-to-address-id" author="riste.tutureski">
        <dropColumn tableName="acm_complaint" columnName="cm_location"/>
        <addColumn tableName="acm_complaint">
            <column name="cm_address_id" type="${fkIdType}"/>
        </addColumn>
    </changeSet>

    <changeSet id="complaint-16-add-restricted-flag" author="dmiller">
        <addColumn tableName="acm_complaint">
            <column name="cm_complaint_restricted_flag" type="VARCHAR(32)" defaultValue="false">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="complaint-17-add-container-folder-id" author="dmiller">
        <addColumn tableName="acm_complaint">
            <column name="cm_container_folder_id" type="${fkIdType}"/>
        </addColumn>
    </changeSet>

    <changeSet id="complaint-18-rename-container-id" author="dmiller">
        <renameColumn tableName="acm_complaint" oldColumnName="cm_container_folder_id" newColumnName="cm_container_id"
            columnDataType="${fkIdType}"/>
    </changeSet>

    <changeSet id="19-object-type-in-acm-complaint-table" author="nebojsha.davidovikj">
        <addColumn tableName="acm_complaint">
            <column name="cm_object_type" type="VARCHAR(100)" defaultValue="COMPLAINT">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="20-object-type-in-acm-close-complaint-request-table" author="nebojsha.davidovikj">
        <addColumn tableName="acm_close_complaint_request">
            <column name="cm_object_type" type="VARCHAR(100)" defaultValue="CLOSE_COMPLAINT_REQUEST">
                <constraints nullable="false"/>
            </column>
        </addColumn>
    </changeSet>

    <changeSet id="21-acm_complaint-id" author="nebojsha.davidovikj">
        <createTable tableName="acm_complaint_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_complaint_id">
            <column name="cm_seq_num" value="100"></column>
            <column name="cm_seq_name" value="acm_complaint"></column>
        </insert>
    </changeSet>
    <changeSet id="22-acm_close_complaint_request-id" author="nebojsha.davidovikj">
        <createTable tableName="acm_close_complaint_request_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_close_complaint_request_id">
            <column name="cm_seq_num" value="100"></column>
            <column name="cm_seq_name" value="acm_close_complaint_request"></column>
        </insert>
    </changeSet>

    <!-- adding discriminator column, needed for extensibility -->
    <changeSet id="23-acm_complaint-add-discriminator-column-extensibility" author="riste.tutureski">
        <addColumn tableName="acm_complaint">
            <column name="cm_class_name" type="VARCHAR(400)"/>
        </addColumn>
    </changeSet>

    <changeSet id="24-acm_complaint-add-legacy_system-columns" author="riste.tutureski">
        <addColumn tableName="acm_complaint">
            <column name="cm_legacy_system_id" type="VARCHAR(255)"/>
        </addColumn>
    </changeSet>

    <changeSet id="25-add-complaint-address-table" author="sharmilee.sivakumaran">
        <preConditions onFail="MARK_RAN">
            <foreignKeyConstraintExists foreignKeyName="fk_complaint_address_id"/>
        </preConditions>
        <addColumn tableName="acm_complaint">
            <column name="cm_default_address" type="${fkIdType}"/>
        </addColumn>
        <createTable tableName="acm_complaint_postal_address">
            <column name="cm_complaint_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_address_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <createIndex tableName="acm_complaint_postal_address" indexName="idx_complaint_addr_complaint_id">
            <column name="cm_complaint_id"/>
        </createIndex>
        <createIndex tableName="acm_complaint_postal_address" indexName="idx_complaint_addr_addr_id">
            <column name="cm_address_id"/>
        </createIndex>
        <sql>INSERT INTO acm_complaint_postal_address (cm_complaint_id, cm_address_id) SELECT cm_complaint_id,
            cm_address_id FROM acm_complaint WHERE cm_address_id IS NOT NULL
        </sql>
        <sql>UPDATE acm_complaint SET cm_default_address=cm_address_id
        </sql>
        <dropForeignKeyConstraint baseTableName="acm_complaint" constraintName="fk_complaint_address_id"/>
        <dropColumn tableName="acm_complaint" columnName="cm_address_id"/>
    </changeSet>

    <changeSet id="26-add-complaint-address-table-if-25-add-complaint-address-table-failed" author="bojan.milenkoski">
        <preConditions onFail="MARK_RAN">
            <columnExists tableName="acm_complaint" columnName="cm_address_id"/>
        </preConditions>
        <addColumn tableName="acm_complaint">
            <column name="cm_default_address" type="${fkIdType}"/>
        </addColumn>
        <createTable tableName="acm_complaint_postal_address">
            <column name="cm_complaint_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_address_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <createIndex tableName="acm_complaint_postal_address" indexName="idx_complaint_addr_complaint_id">
            <column name="cm_complaint_id"/>
        </createIndex>
        <createIndex tableName="acm_complaint_postal_address" indexName="idx_complaint_addr_addr_id">
            <column name="cm_address_id"/>
        </createIndex>
        <sql>INSERT INTO acm_complaint_postal_address (cm_complaint_id, cm_address_id) SELECT cm_complaint_id,
            cm_address_id FROM acm_complaint WHERE cm_address_id IS NOT NULL
        </sql>
        <sql>UPDATE acm_complaint SET cm_default_address=cm_address_id
        </sql>
    </changeSet>

    <changeSet id="27-description-in-acm-close-complaint-request-table" author="dimitar.stefanovski">
        <addColumn tableName="acm_close_complaint_request">
            <column name="cm_close_complaint_description" type="VARCHAR(1024)"/>
        </addColumn>
    </changeSet>

    <changeSet id="28-change_cm_complaint_datetime" author="mario.gjurcheski" dbms="mysql">
        <modifyDataType tableName="acm_complaint" columnName="cm_complaint_created" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_complaint" columnName="cm_complaint_modified" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_complaint" columnName="cm_complaint_incident_date" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_complaint" columnName="cm_due_date" newDataType="DATETIME"/>
    </changeSet>
    <changeSet id="29-change_cm_close_complaint_request_datetime" author="mario.gjurcheski" dbms="mysql">
        <modifyDataType tableName="acm_close_complaint_request" columnName="cm_close_complaint_created" newDataType="DATETIME"/>
        <modifyDataType tableName="acm_close_complaint_request" columnName="cm_close_complaint_modified" newDataType="DATETIME"/>
    </changeSet>
    <changeSet id="30-change-character-set-to-complaint-description" author="konstantin.cepas" dbms="mysql">
        <sql>
            ALTER IGNORE TABLE acm_complaint MODIFY COLUMN cm_complaint_details LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
        </sql>
    </changeSet>
    <changeSet id="31-change-character-set-to-complaint-title" author="konstantin.cepas" dbms="mysql">
        <sql>
            ALTER IGNORE TABLE acm_complaint MODIFY COLUMN cm_complaint_title VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
        </sql>
    </changeSet>
</databaseChangeLog>

