<?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="urvigala">
        <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
            USE `compilations`;;

            DROP PROCEDURE IF EXISTS `sp_insert_catalog_library`;;

            CREATE PROCEDURE `sp_insert_catalog_library`(OUT param1 INT, OUT param2 INT, OUT param3 INT)
            BEGIN

            -- Truncate data from tables before insert.
            TRUNCATE TABLE catalog_library;
            TRUNCATE TABLE territory_carveout;
            TRUNCATE TABLE dms_carveout;
            
            -- Insert release and track level metadata into catalog_library
            SET group_concat_max_len=1024*800;
            INSERT INTO compilations.catalog_library
            (tuid, release_name, track_name, isrc, upc, display_artist,
            track_composers, track_performers, track_orchestras, track_conductors,
            track_ensembles, cd, track_id, genre, sub_genere, label_name, length_minute,
            length_seconds, label_id, p_line, deletions, songwriter, publisher, orchard_compilation_authorization_required)
            SELECT
            t.id,
            r.release_name,
            t.track_name,
            t.isrc,
            r.upc,
            a.name,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'composer' THEN ta.name END) AS track_composer,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'performer' THEN ta.name END) AS track_performer,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'orchestra' THEN ta.name END) AS track_orchestra,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'conductor' THEN ta.name END) AS track_conductor,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'ensemble' THEN ta.name END) AS track_ensemble,
            t.cd AS 'CD Volume',
            t.track_id,
            g.`genre`,
            s.`name` AS 'Sub-genre',
            IF(vendors.company='' OR vendors.company IS NULL, vendors.name, vendors.company) AS label_name,
            t.length_minute,
            t.length_seconds,
            vendors.vendor_id AS 'Original Label ID',
            t.p_line,
            r.deletions,
            GROUP_CONCAT(DISTINCT tw.`writer_name`) AS track_writer,
            GROUP_CONCAT(DISTINCT tp.`publisher_name`) AS track_publisher,
            vendors.orchard_compilation_authorization_required
            FROM (
            SELECT avc.vendor_id,v.name,v.company,vc_comp.orchard_compilation_authorization_required
            FROM art_relations.vw_active_vendor_contract avc
            JOIN art_relations.vendor_contract_compilation vc_comp ON vc_comp.vendor_contract_id = avc.vendor_contract_id
            JOIN art_relations.vendor v ON v.vendor_id = avc.vendor_id
            WHERE vc_comp.orchard_compilation_agreement = 'Y'
            ) AS vendors
            JOIN art_relations.`vendor` v ON v.`vendor_id` = vendors.vendor_id
            JOIN art_relations.artist_info a ON a.`vendor_id` = v.`vendor_id`
            JOIN art_relations.releases r ON r.`artist_id` = a.`artist_id` AND r.deletions != 'Y'
            JOIN art_relations.track t ON t.upc = r.upc
            LEFT JOIN art_relations.track_artist ta ON ta.`track_id` = t.`id`
            LEFT JOIN art_relations.`track_writer` tw ON tw.`unique_track_id` = t.`id`
            LEFT JOIN art_relations.`track_publisher` tp ON tp.`unique_track_id` = t.`id`
            LEFT JOIN art_relations.`genre` g ON r.`genre_id` = g.`genre_id`
            LEFT JOIN art_relations.`release_subgenre` rs ON rs.`release_id` = r.`release_id`
            LEFT JOIN art_relations.`subgenre` s ON s.`orchard_id` = rs.`subgenre_id`
            GROUP BY t.`id`;

            -- Insert data into territory_carveout
            SET group_concat_max_len=1024*800;
            INSERT INTO compilations.territory_carveout
            (label_id, upc, territory_carveouts)
            SELECT cl.label_id, cl.upc, vc.territory_carve_out
            FROM compilations.catalog_library cl
            INNER JOIN art_relations.vw_active_vendor_contract avc ON avc.vendor_id = cl.label_id
            INNER JOIN art_relations.vendor_contract vc ON vc.id = avc.vendor_contract_id
            GROUP BY cl.upc;

            -- Insert data into dms_carveout
            INSERT INTO compilations.`dms_carveout`
            (label_id, upc, dms_carveouts)
            SELECT cl.label_id, cl.upc AS upc,
            GROUP_CONCAT(DISTINCT vdmr.customer_master_master_id) AS dms_carveouts
            FROM art_relations.vendor v 
            INNER JOIN compilations.`catalog_library` cl ON cl.label_id = v.`vendor_id`
            INNER JOIN art_relations.vw_active_vendor_contract avc ON avc.vendor_id = cl.label_id
            LEFT JOIN art_relations.vendor_dms_master_restriction vdmr ON vdmr.vendor_contract_id = avc.vendor_contract_id 
            AND vdmr.`vendor_contract_id` IS NOT NULL
            GROUP BY cl.upc;
            SELECT COUNT(*) FROM compilations.catalog_library INTO param1 ;
            SELECT COUNT(*) FROM compilations.territory_carveout INTO param2 ;
            SELECT COUNT(*) FROM compilations.dms_carveout INTO param3 ;
            END;;
        </sql>
        <rollback>
            <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
            USE `compilations`;;

            DROP PROCEDURE IF EXISTS `sp_insert_catalog_library`;;

            CREATE PROCEDURE `sp_insert_catalog_library`(OUT param1 INT, OUT param2 INT, OUT param3 INT)
            BEGIN

            -- Truncate data from tables before insert.
            TRUNCATE TABLE catalog_library;
            TRUNCATE TABLE territory_carveout;
            TRUNCATE TABLE dms_carveout;

            -- Insert release and track level metadata into catalog_library
            INSERT INTO compilations.catalog_library
            (tuid, release_name, track_name, isrc, manufacturer_upc, display_artist,
            track_composers, track_performers, track_orchestras, track_conductors,
            track_ensembles, cd, track_id, genre, sub_genere, label_name, length_minute,
            length_seconds, orchard_upc, label_id, p_line, deletions, songwriter, publisher)
            SELECT
            t.id,
            r.release_name,
            t.track_name,
            t.isrc,
            r.upc,
            a.name,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'composer' THEN ta.name END) AS track_composer,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'performer' THEN ta.name END) AS track_performer,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'orchestra' THEN ta.name END)    AS track_orchestra,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'conductor' THEN ta.name END) AS track_conductor,
            GROUP_CONCAT(DISTINCT CASE WHEN ta.type = 'ensemble' THEN ta.name END) AS track_ensemble,
            t.cd AS 'CD Volume',
            t.track_id,
            g.`genre`,
            s.`name` AS 'Sub-genre',
            IF(v.company='' OR v.company IS NULL, v.name, v.company) AS label_name,
            t.length_minute,
            t.length_seconds,
            carveouts.dupe_upc AS 'Orchard
            (Cross-Label) UPC',
            v.vendor_id AS 'Original Label ID',
            t.p_line,
            r.deletions,
            GROUP_CONCAT(DISTINCT tw.`writer_name`) AS track_writer,
            GROUP_CONCAT(DISTINCT tp.`publisher_name`) AS track_publisher
            FROM (
                SELECT
                orig_r.upc,
                dupe_r.upc AS dupe_upc
                FROM art_relations.releases dupe_r
                INNER JOIN art_relations.releases orig_r ON dupe_r.manufacturer_upc = orig_r.upc
                INNER JOIN art_relations.artist_info dupe_ai ON dupe_ai.artist_id = dupe_r.artist_id AND dupe_ai.vendor_id = 17292
                WHERE dupe_r.deletions != 'Y'
                AND dupe_r.compilation = 'N'
                GROUP BY orig_r.upc
            ) AS carveouts
            JOIN art_relations.releases r ON r.upc = carveouts.upc
            JOIN art_relations.artist_info a ON a.artist_id=r.artist_id
            JOIN art_relations.vendor v ON v.vendor_id = a.vendor_id
            JOIN art_relations.track t ON t.upc = r.upc
            LEFT JOIN art_relations.track_artist ta ON ta.`track_id` = t.`id`
            LEFT JOIN art_relations.`track_writer` tw ON tw.`unique_track_id` = t.`id`
            LEFT JOIN art_relations.`track_publisher` tp ON tp.`unique_track_id` = t.`id`
            LEFT JOIN art_relations.`genre` g ON r.`genre_id` = g.`genre_id`
            LEFT JOIN art_relations.`release_subgenre` rs ON rs.`release_id` = r.`release_id`
            LEFT JOIN art_relations.`subgenre` s ON s.`orchard_id` = rs.`subgenre_id`
            GROUP BY t.`id`;

            -- Insert data into territory_carveout
            SET group_concat_max_len=1024*800;
            INSERT INTO compilations.territory_carveout
            (label_id, upc, territory_carveouts)
            SELECT cl.label_id, cl.manufacturer_upc, vc.territory_carve_out
            FROM compilations.catalog_library cl
            INNER JOIN art_relations.vw_active_vendor_contract avc ON avc.vendor_id = cl.label_id
            INNER JOIN art_relations.vendor_contract vc ON vc.id = avc.vendor_contract_id
            GROUP BY cl.manufacturer_upc;

            -- Insert data into dms_carveout
            INSERT INTO compilations.`dms_carveout`
            (label_id, upc, dms_carveouts)
            SELECT cl.label_id, cl.manufacturer_upc AS upc,
            GROUP_CONCAT(DISTINCT vdmr.customer_master_master_id) AS dms_carveouts
            FROM art_relations.vendor v 
            INNER JOIN compilations.`catalog_library` cl ON cl.label_id = v.`vendor_id`
            INNER JOIN art_relations.vw_active_vendor_contract avc ON avc.vendor_id = cl.label_id
            LEFT JOIN art_relations.vendor_dms_master_restriction vdmr ON vdmr.vendor_contract_id = avc.vendor_contract_id 
            AND vdmr.`vendor_contract_id` IS NOT NULL
            GROUP BY cl.manufacturer_upc;

            SELECT COUNT(*) FROM compilations.catalog_library INTO param1 ;
            SELECT COUNT(*) FROM compilations.territory_carveout INTO param2 ;
            SELECT COUNT(*) FROM compilations.dms_carveout INTO param3 ;
            END;;
            </sql>
        </rollback>
    </changeSet>
</databaseChangeLog>
