<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="cmAuditActivityLength" value="1024" dbms="postgresql,oracle"/>
    <property name="cmAuditActivityLength" value="255" dbms="mysql,mssql"/>

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

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

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

    <changeSet id="01-create-audit-table" author="dmiller">
        <createTable tableName="acm_audit_log">
            <column name="cm_audit_id" type="${idType}">
                <constraints primaryKey="true" primaryKeyName="pk_audit_log"/>
            </column>
            <column name="cm_audit_datetime" type="${timestampType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_audit_user" type="VARCHAR(1024)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_audit_activity" type="VARCHAR(${cmAuditActivityLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_audit_activity_result" type="VARCHAR(256)">
                <constraints nullable="false"/>
            </column>
            <column name="cm_audit_ip_address" type="VARCHAR(256)"/>
        </createTable>
        <createTable tableName="acm_audit_log_property">
            <column name="cm_audit_id" type="${fkIdType}">
                <constraints nullable="false"/>
            </column>
            <column name="cm_audit_property_name" type="VARCHAR(${cmAuditPropertyNameLength})">
                <constraints nullable="false"/>
            </column>
            <column name="cm_audit_property_value" type="VARCHAR(4000)"/>
        </createTable>
        <addPrimaryKey tableName="acm_audit_log_property" columnNames="cm_audit_id, cm_audit_property_name"
            constraintName="pk_audit_log_property"/>
        <createIndex tableName="acm_audit_log" indexName="idx_audit_log_user">
            <column name="cm_audit_user"/>
        </createIndex>
        <createIndex tableName="acm_audit_log" indexName="idx_audit_log_activity">
            <column name="cm_audit_activity"/>
        </createIndex>
        <createIndex tableName="acm_audit_log" indexName="idx_audit_log_date">
            <column name="cm_audit_datetime"/>
        </createIndex>
    </changeSet>

    <changeSet id="02-add-track-id-column" author="dmiller">
        <addColumn tableName="acm_audit_log">
            <column name="cm_audit_track_id" type="VARCHAR(1024)"/>
        </addColumn>
        <createIndex tableName="acm_audit_log" indexName="idx_audit_log_track_id">
            <column name="cm_audit_track_id"/>
        </createIndex>
    </changeSet>

    <changeSet id="04-add-object-type-columns" author="dmiller">
        <addColumn tableName="acm_audit_log">
            <column name="cm_object_type" type="VARCHAR(${cmObjectTypeLength})"/>
            <column name="cm_object_id" type="${fkIdType}"/>
        </addColumn>
        <createIndex tableName="acm_audit_log" indexName="idx_audit_log_object_id">
            <column name="cm_object_id"/>
        </createIndex>
    </changeSet>

    <changeSet id="05-add-status-column-in-acm-audit-log-table" author="riste.tutureski">
        <addColumn tableName="acm_audit_log">
            <column name="cm_audit_status" type="VARCHAR(1024)" defaultValue="DRAFT"/>
        </addColumn>
    </changeSet>

    <changeSet id="06-acm_audit_event_type_lu-table" author="martin.bozinvski">
        <preConditions onFail="MARK_RAN">
            <tableExists tableName="acm_audit_event_type_lu" />
        </preConditions>
        <dropTable tableName="acm_audit_event_type_lu" cascadeConstraints="true" />
    </changeSet>
    
    <changeSet id="07-acm_audit_log-id" author="nebojsha.davidovikj">
        <createTable tableName="acm_audit_log_id">
            <column name="cm_seq_num" type="${idType}"/>
            <column name="cm_seq_name" type="VARCHAR(255)"/>
        </createTable>
        <insert tableName="acm_audit_log_id">
            <column name="cm_seq_num" value="100"></column>
            <column name="cm_seq_name" value="acm_audit_log"></column>
        </insert>
    </changeSet>

    <changeSet id="08-acm_audit_event_type_lu_id-table" author="martin.bozinvski">
        <preConditions onFail="MARK_RAN">
            <tableExists tableName="acm_audit_event_type_lu_id" />
        </preConditions>
        <dropTable tableName="acm_audit_event_type_lu_id" cascadeConstraints="true" />
    </changeSet>

    <changeSet id="09-acm_audit_add_requestId_column" author="bojan.milenkoski">
        <addColumn tableName="acm_audit_log">
            <column name="cm_audit_request_id" type="VARCHAR(36)"/>
        </addColumn>
    </changeSet>

    <changeSet id="10-acm_audit_log_property_change_cm_audit_property_value_column_type" author="bojan.milenkoski">
        <modifyDataType columnName="cm_audit_property_value" newDataType="CLOB" tableName="acm_audit_log_property"/>
    </changeSet>

    <changeSet id="11-acm_audit_add_parent_object_type_columns" author="riste.tutureski">
        <addColumn tableName="acm_audit_log">
            <column name="cm_parent_object_id" type="${fkIdType}"/>
            <column name="cm_parent_object_type" type="VARCHAR(128)"/>
        </addColumn>
    </changeSet>

    <changeSet id="12-acm_audit_add_event_description_column" author="sasko.tanaskoski">
        <addColumn tableName="acm_audit_log">
            <column name="cm_audit_description" type="VARCHAR(1024)"/>
        </addColumn>
    </changeSet>

    <changeSet id="13-acm_audit-add-diff_details-column" author="nebojsha.davidovikj">
        <addColumn tableName="acm_audit_log">
            <column name="cm_diff_details_json" type="CLOB"/>
        </addColumn>
    </changeSet>

    <changeSet id="14-add-index-parent_object_id" author="ilinpetar">
        <preConditions onFail="MARK_RAN">
            <not>
                <indexExists tableName="acm_audit_log" indexName="idx_audit_log_parent_object_id"/>
            </not>
        </preConditions>
        <createIndex tableName="acm_audit_log" indexName="idx_audit_log_parent_object_id">
            <column name="cm_parent_object_id"/>
        </createIndex>
    </changeSet>

    <changeSet id="15-change_cm_audit_log_datetime" author="mario.gjurcheski" dbms="mysql">
        <modifyDataType tableName="acm_audit_log" columnName="cm_audit_datetime" newDataType="DATETIME"/>
    </changeSet>

    <changeSet id="16-change-character-set-to-filename" author="ivan.tasevski" dbms="mysql">
        <sql>
            ALTER IGNORE TABLE acm_audit_log MODIFY COLUMN cm_audit_description VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;
        </sql>
    </changeSet>
    
    <changeSet id="17-change-character-set-to-filename" author="bojan.milenkoski" dbms="mysql">
        <sql>
            ALTER IGNORE TABLE acm_audit_log MODIFY COLUMN cm_audit_description VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
        </sql>
    </changeSet>

    <changeSet id="18-change-character-set-to-diff-details" author="konstantin.cepas" dbms="mysql">
        <sql>
            ALTER IGNORE TABLE acm_audit_log MODIFY COLUMN cm_diff_details_json LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
        </sql>
    </changeSet>
</databaseChangeLog>
    

