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

            CREATE PROCEDURE sp_backfill_sales_goals(IN backfill_table_name VARCHAR(30))
            BEGIN
                DECLARE product_id_to_insert INT;
                DECLARE sales_goal_created_id INT;
                DECLARE sales_goal_last_updated INT;
                DECLARE order_target_id_to_insert INT;

                DECLARE cursor_end CONDITION FOR SQLSTATE '02000';
                DECLARE done INT DEFAULT FALSE;
                DECLARE order_target_ids CURSOR FOR SELECT * FROM prepared_view;
                DECLARE CONTINUE HANDLER FOR cursor_end SET done = TRUE;
                START TRANSACTION;
                  SET @SQL = CONCAT('CREATE VIEW prepared_view as select order_target_id from ', backfill_table_name);
                  PREPARE stmt from @SQL;
                  EXECUTE stmt;
                  DEALLOCATE PREPARE stmt;

                  OPEN order_target_ids;

                  insert_loop: LOOP
                      FETCH order_target_ids INTO order_target_id_to_insert;
                      IF done THEN leave insert_loop;
                      END IF;

                      BLOCK2: BEGIN

                        SET @SQL := CONCAT(
                          'SELECT product_id INTO @product_id_to_insert FROM ',
                          backfill_table_name, ' WHERE order_target_id=',
                          order_target_id_to_insert);
                        PREPARE stmt FROM @SQL;
                        EXECUTE stmt;
                        DEALLOCATE PREPARE stmt;

                        SET product_id_to_insert=@product_id_to_insert;

                        IF NOT EXISTS (SELECT * FROM sales_goal WHERE product_id=product_id_to_insert) THEN

                          SET @SQL := CONCAT(
                            'INSERT INTO sales_goal(product_id, updated_at) SELECT product_id, last_updated as updated_at FROM ',
                            backfill_table_name, ' WHERE order_target_id=',
                            order_target_id_to_insert);
                          PREPARE stmt FROM @SQL;
                          EXECUTE stmt;
                          DEALLOCATE PREPARE stmt;

                          SET @sales_goal_created_id=(SELECT LAST_INSERT_ID() from sales_goal LIMIT 1);

                        ELSE
                          SET @sales_goal_created_id=(SELECT id FROM sales_goal WHERE product_id=product_id_to_insert);

                          SET @SQL := CONCAT(
                            'SELECT last_updated INTO @sales_goal_last_updated FROM ',
                            backfill_table_name, ' WHERE order_target_id=',
                            order_target_id_to_insert);
                          PREPARE stmt FROM @SQL;
                          EXECUTE stmt;
                          DEALLOCATE PREPARE stmt;


                          UPDATE sales_goal
                          SET updated_at=CASE
                            WHEN updated_at < @sales_goal_last_updated THEN @sales_goal_last_updated
                            ELSE updated_at
                          END
                          WHERE id=@sales_goal_created_id;

                        END IF;

                        SET @SQL := CONCAT(
                          'SELECT count(id) INTO @target_market_goal_exists FROM target_market_goal WHERE sales_goal_id=', @sales_goal_created_id,
                            ' AND country_id=3 AND store_id=( SELECT id AS store_id FROM store WHERE ( `name` IN ( SELECT type FROM ',
                          backfill_table_name, ' WHERE order_target_id=', order_target_id_to_insert,
                          ' ) OR `name`="Other") LIMIT 1)');
                        PREPARE stmt FROM @SQL;
                        EXECUTE stmt;
                        DEALLOCATE PREPARE stmt;

                        IF @target_market_goal_exists >= 1 THEN

                          SET @SQL := CONCAT(
                            'UPDATE target_market_goal SET distribution_goal_value=(SELECT target FROM ',
                            backfill_table_name, ' WHERE order_target_id=', order_target_id_to_insert,
                            ' ) WHERE id IN ( SELECT id FROM (SELECT * FROM target_market_goal) AS target_market_goal_sub WHERE sales_goal_id=',
                            @sales_goal_created_id,
                            ' AND country_id=3 AND store_id=( SELECT id AS store_id FROM store WHERE ( `name` IN ( SELECT type FROM ',
                            backfill_table_name, ' WHERE order_target_id=', order_target_id_to_insert, ') OR `name`="Other") LIMIT 1))'
                            );
                          PREPARE stmt FROM @SQL;
                          EXECUTE stmt;
                          DEALLOCATE PREPARE stmt;

                        ELSE

                          SET @SQL := CONCAT(
                            'INSERT INTO target_market_goal (distribution_goal_value, sales_goal_id, country_id, country_name, store_id) SELECT target as distribution_goal_value, ',
                            @sales_goal_created_id,
                            ', 3, "United Kingdom", (SELECT id AS store_id FROM store WHERE (`name` IN (SELECT type FROM ',
                            backfill_table_name,
                            ' WHERE order_target_id=', order_target_id_to_insert, ') OR `name`="Other") LIMIT 1) FROM ',
                            backfill_table_name, ' WHERE order_target_id=', order_target_id_to_insert);
                          PREPARE stmt FROM @SQL;
                          EXECUTE stmt;
                          DEALLOCATE PREPARE stmt;

                        END IF;

                      END BLOCK2;
                  END LOOP;
                  CLOSE order_target_ids;
                  DROP VIEW prepared_view;
                COMMIT;
            END;;
        ]]>
        </sql>
        <rollback>
            DROP PROCEDURE IF EXISTS sp_backfill_sales_goals;;
        </rollback>
    </changeSet>
</databaseChangeLog>
