<?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="10101" author="jian">
        <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
        <![CDATA[
            DROP PROCEDURE IF EXISTS sp_create_third_party_delivery_batch;;

            CREATE DEFINER='theorchard_dd'@'127.0.0.1' PROCEDURE sp_create_third_party_delivery_batch(IN dms_id INT, IN remote_dir VARCHAR(255), IN ord_type VARCHAR(50), IN num_per_batch INT, IN third_party_cred_id INT)
            BEGIN
                DECLARE batch_id INT;
                DECLARE eqd_id INT;
                DECLARE prio_id INT;
                DECLARE last_prio_id INT DEFAULT 0;
                DECLARE done INT DEFAULT 0;
                DECLARE encoded_jobs CURSOR FOR
                    SELECT eqd.encoding_queue_detail_id, jp.priority
                    FROM encoding_queue_detail eqd
                    INNER JOIN encoding_queue eq ON eqd.encoding_queue_id = eq.encoding_queue_id
                    INNER JOIN job_priority jp ON jp.encoding_queue_detail_id = eqd.encoding_queue_detail_id
                    INNER JOIN product_third_party_credential_set ptpcs ON ptpcs.upc = eqd.upc 
                        AND ptpcs.dms_master_master_id = eqd.dms_master_master_id
                    WHERE eqd.status = 'encoded'
                        AND eq.encoder_id IN (17,18,23)
                        AND eqd.dms_master_master_id = dms_id
                        AND eq.encoding_order_type = ord_type
                        AND ptpcs.third_party_credential_set_id = third_party_cred_id
                    ORDER BY jp.priority
                    LIMIT num_per_batch;
                DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
                DECLARE EXIT HANDLER FOR SQLEXCEPTION
                BEGIN
                    ROLLBACK;
                    RESIGNAL;
                END;
                 
                START TRANSACTION;
                
                OPEN encoded_jobs;
                IF FOUND_ROWS() < 1 THEN
                    SELECT 0 AS batch_id;
                    ROLLBACK;
                END IF;

                INSERT INTO delivery_batch (dms_master_master_id, remote_folder, `status`, order_type, third_party_credential_set_id)
                VALUES (dms_id, remote_dir, 'in-flight', ord_type, third_party_cred_id);
                SET batch_id = LAST_INSERT_ID();
                
                oj: LOOP
                    FETCH encoded_jobs INTO eqd_id, prio_id;

                    IF done THEN
                        LEAVE oj;
                    END IF;

                    IF last_prio_id = 0 THEN
                        SET last_prio_id = prio_id;
                    ELSEIF last_prio_id <> prio_id THEN
                        LEAVE oj;
                    END IF;

                    UPDATE encoding_queue_detail
                    SET status = 'ready_to_deliver'
                    WHERE encoding_queue_detail_id = eqd_id AND status = 'encoded';
                
                    IF ROW_COUNT() > 0 THEN
                        INSERT INTO delivery_batch_detail (delivery_batch_id, encoding_queue_detail_id) VALUES (batch_id, eqd_id);

                        INSERT INTO job_third_party_credential_set (encoding_queue_detail_id, third_party_credential_set_id)
                        VALUES (eqd_id, third_party_cred_id)
                        ON DUPLICATE KEY UPDATE third_party_credential_set_id = VALUES(third_party_credential_set_id);
                    END IF;
                END LOOP oj;
                CLOSE encoded_jobs;
                
                UPDATE delivery_batch SET status = 'open', priority = last_prio_id WHERE status = 'in-flight' AND delivery_batch_id = batch_id;
                IF ROW_COUNT() > 0 THEN
                    SELECT batch_id;
                    COMMIT;
                ELSE
                    SELECT 0 AS batch_id;
                    ROLLBACK;
                END IF;
            END;;

            GRANT EXECUTE ON PROCEDURE direct_delivery.sp_create_third_party_delivery_batch TO 'lambda-rdy-dlvr'@'%';;
        ]]>
        </sql>
        <rollback>
            <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
            <![CDATA[
                DROP PROCEDURE IF EXISTS sp_create_third_party_delivery_batch;;
            ]]>
            </sql>
        </rollback>
    </changeSet>
</databaseChangeLog>
