<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
    <changeSet id="101" author="cgorman">
        <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
            <![CDATA[
                USE direct_delivery;;

                DROP PROCEDURE IF EXISTS sp_get_next_batch_to_close;;

                CREATE DEFINER=`theorchard_dd`@`127.0.0.1` PROCEDURE `sp_get_next_batch_to_close`()
                BEGIN
                    DECLARE done INT DEFAULT FALSE;
                    DECLARE current_batch_id INT;
                    DECLARE batch_id INT DEFAULT 0;
                    DECLARE open_batches CURSOR FOR
                        SELECT db.delivery_batch_id
                        FROM delivery_batch db
                        INNER JOIN customer_master_master cmm ON db.dms_master_master_id = cmm.customer_master_master_id
                        WHERE db.status = 'open'
                        ORDER BY db.priority, cmm.priority;
                    DECLARE current_batch CURSOR FOR
                        SELECT dbd.delivery_batch_id
                        FROM delivery_batch_detail dbd
                        INNER JOIN encoding_queue_detail eqd ON eqd.encoding_queue_detail_id = dbd.encoding_queue_detail_id
                        WHERE eqd.status IN ('delivering', 'ready_to_deliver', 'queued_for_delivery')
                            AND dbd.delivery_batch_id = current_batch_id
                        LIMIT 1;
                    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

                    OPEN open_batches;
                    ob: LOOP
                        FETCH open_batches INTO current_batch_id;
                        IF done THEN
                            LEAVE ob;
                        END IF;

                        UPDATE delivery_batch SET `status` = 'in-flight' WHERE delivery_batch_id = current_batch_id AND `status` = 'open';
                        IF ROW_COUNT() > 0 THEN
                            OPEN current_batch;
                            IF FOUND_ROWS() > 0 THEN
                                UPDATE delivery_batch SET `status` = 'open' WHERE delivery_batch_id = current_batch_id AND `status` = 'in-flight';
                    CLOSE current_batch;
                                ITERATE ob;
                            END IF;
                            CLOSE current_batch;

                            UPDATE delivery_batch SET `status` = 'ready_to_close' WHERE delivery_batch_id = current_batch_id AND `status` = 'in-flight';
                        END IF;
                    END LOOP ob;
                    CLOSE open_batches;

                    SELECT db.delivery_batch_id, db.dms_master_master_id FROM delivery_batch db
                    INNER JOIN dms_delivery_spec dds ON db.`dms_master_master_id` = dds.`dms_master_master_id`
                        AND dds.`order_type` = db.`order_type`
                    WHERE db.`status` = 'ready_to_close' AND dds.`delivery` = 'Y';
                END;;
            ]]>
        </sql>
        <rollback>
            <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
                <![CDATA[
                USE direct_delivery;;

                DROP PROCEDURE IF EXISTS sp_get_next_batch_to_close;;

                CREATE DEFINER=`theorchard_dd`@`127.0.0.1` PROCEDURE `sp_get_next_batch_to_close`()
                BEGIN
                    DECLARE done INT DEFAULT FALSE;
                    DECLARE current_batch_id INT;
                    DECLARE batch_id INT DEFAULT 0;
                    DECLARE open_batches CURSOR FOR
                        SELECT db.delivery_batch_id
                        FROM delivery_batch db
                        INNER JOIN customer_master_master cmm ON db.dms_master_master_id = cmm.customer_master_master_id
                        WHERE db.status = 'open'
                        ORDER BY db.priority, cmm.priority;
                    DECLARE current_batch CURSOR FOR
                        SELECT dbd.delivery_batch_id
                        FROM delivery_batch_detail dbd
                        INNER JOIN encoding_queue_detail eqd ON eqd.encoding_queue_detail_id = dbd.encoding_queue_detail_id
                        WHERE eqd.status IN ('delivering', 'ready_to_deliver', 'queued_for_delivery')
                            AND dbd.delivery_batch_id = current_batch_id
                        LIMIT 1;
                    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

                    OPEN open_batches;
                    ob: LOOP
                        FETCH open_batches INTO current_batch_id;
                        IF done THEN
                            LEAVE ob;
                        END IF;

                        UPDATE delivery_batch SET `status` = 'in-flight' WHERE delivery_batch_id = current_batch_id AND `status` = 'open';
                        IF ROW_COUNT() > 0 THEN
                            OPEN current_batch;
                            IF FOUND_ROWS() > 0 THEN
                                UPDATE delivery_batch SET `status` = 'open' WHERE delivery_batch_id = current_batch_id AND `status` = 'in-flight';
                    CLOSE current_batch;
                                ITERATE ob;
                            END IF;
                            CLOSE current_batch;

                            UPDATE delivery_batch SET `status` = 'ready_to_close' WHERE delivery_batch_id = current_batch_id AND `status` = 'in-flight';
                        END IF;
                    END LOOP ob;
                    CLOSE open_batches;

                    SELECT db.delivery_batch_id FROM delivery_batch db
                    INNER JOIN dms_delivery_spec dds ON db.`dms_master_master_id` = dds.`dms_master_master_id`
                        AND dds.`order_type` = db.`order_type`
                    WHERE db.`status` = 'ready_to_close' AND dds.`delivery` = 'Y';
                    END;;
            ]]>
            </sql>
        </rollback>
    </changeSet>
</databaseChangeLog>
