<?xml version="1.0" encoding="UTF-8"?>
<changelog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="file:/var/app/InputFileSchema.xsd">
    <changeset
     id="SR-500_rimas_track_rules:1"
     author="nlittmann"
     run-always="true"
     topic="event.orchardSoundRecording.fingerprintRules">
        <precondition>
            <sqlquery>
                <![CDATA[
                    WITH 
                        service_ids_to_names AS (
                            SELECT
                                *
                            FROM
                            VALUES
                                (1294, 'tiktok'),
                                (1173, 'meta') 
                            AS services (service_id, service_name)
                        ),
                        filtered_track_ids AS (
                            SELECT dtc.track_unique_id AS tuid
                            FROM FACTS.<SCHEMA_NAME>.DIM_TRACK_CLEAN_MV dtc
                            INNER JOIN FACTS.<SCHEMA_NAME>.DIM_RELEASE dr ON dtc.upc = dr.releaseid
                            INNER JOIN FACTS.<SCHEMA_NAME>.DIM_PROJECT dp ON dr.projectid = dp.projectid
                            WHERE dp.labelid IN (41936, 26760, 21989, 32679) 
                            GROUP BY 1
                        ),
                        territories_in_registry AS (
                            SELECT DISTINCT(territory) AS territory FROM FACTS.<SCHEMA_NAME>.REGISTRY
                        ),
                        territories_in_registry_count AS (
                            SELECT count(*) AS count FROM territories_in_registry
                        ),
                        release_level_dms_star_carveouts AS (
                            SELECT
                                sitn.service_name,
                                tr.id AS tuid,
                                rmr.customer_master_master_id IS NOT NULL AS star_carveout
                            FROM
                                filtered_track_ids fti
                                FULL OUTER JOIN service_ids_to_names sitn
                                LEFT JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.TRACK tr ON fti.tuid = tr.id
                                LEFT JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.RELEASE_DMS_MASTER_RESTRICTION rmr 
                                ON tr.release_id = rmr.release_id AND sitn.service_id = rmr.customer_master_master_id AND rmr.DISTRIBUTION_TYPE_ID = 1      
                            GROUP BY
                                1, 2, 3
                        ),
                        release_level_country_carveouts AS (
                            SELECT
                                sitn.service_name,
                                tr.id AS tuid,
                                cou.COUNTRY_CODE AS territory_carveouts
                            FROM
                                filtered_track_ids fti
                                FULL OUTER JOIN service_ids_to_names sitn
                                INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.TRACK tr ON fti.tuid = tr.id
                                INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.RELEASE_TERRITORY_RESTRICTION rtr ON tr.release_id = rtr.release_id
                                INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.COUNTRY cou ON cou.ID = rtr.COUNTRY_ID
                                INNER JOIN territories_in_registry tir ON tir.territory = cou.COUNTRY_CODE
                            GROUP BY
                                1, 2, 3
                        ),
                        release_level_dms_country_carveouts AS (
                            SELECT
                                sitn.service_name,
                                tr.id AS tuid,
                                cou.COUNTRY_CODE AS territory_carveouts
                            FROM
                                filtered_track_ids fti
                                INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.TRACK tr ON fti.tuid = tr.id
                                INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.RELEASE_DMS_RESTRICTION rr ON tr.release_id = rr.release_id
                                INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.CUSTOMER_MASTER cm ON cm.CUSTOMER_ID = rr.DMS_CUSTOMER_ID
                                INNER JOIN service_ids_to_names sitn ON sitn.service_id = cm.CUSTOMER_MASTER_MASTER_ID
                                INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.COUNTRY cou ON cou.ID = cm.TERRITORY
                                INNER JOIN territories_in_registry tir ON tir.territory = cou.COUNTRY_CODE
                            GROUP BY
                                1, 2, 3
                        ),
                        registry_locked_territories AS (
                            SELECT
                                sitn.service_name,
                                fti.tuid,
                                reg_lock.territory AS territory_carveouts
                            FROM
                                filtered_track_ids fti
                                FULL OUTER JOIN service_ids_to_names sitn
                                INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.TRACK tr ON fti.tuid = tr.id
                                INNER JOIN FACTS.<SCHEMA_NAME>.REGISTRY_LOCKED reg_lock ON tr.isrc = reg_lock.isrc  
                                INNER JOIN territories_in_registry tir ON tir.territory = reg_lock.territory
                            GROUP BY
                                1, 2, 3
                        ),
                        inverse_of_registry AS (
                            SELECT
                                sitn.service_name,
                                filtered_track_ids.tuid,
                                territories_in_registry.territory AS territory_carveouts
                            FROM filtered_track_ids
                            CROSS JOIN territories_in_registry
                            LEFT JOIN FACTS.<SCHEMA_NAME>.REGISTRY registry
                            ON filtered_track_ids.tuid = registry.tuid 
                            AND territories_in_registry.territory = registry.territory
                            FULL OUTER JOIN service_ids_to_names sitn
                            WHERE registry.tuid IS NULL
                            GROUP BY 1, 2, 3
                        ),
                        combined_territories AS (
                            SELECT * FROM (
                                SELECT * FROM release_level_country_carveouts
                                UNION
                                SELECT * FROM release_level_dms_country_carveouts
                                UNION
                                SELECT * FROM registry_locked_territories
                                UNION
                                SELECT * FROM inverse_of_registry
                            )
                            WHERE territory_carveouts IN (SELECT * FROM territories_in_registry)
                            GROUP BY 1, 2, 3
                        ),
                        are_all_territories_carved_out AS (
                            SELECT 
                                service_name,
                                tuid,
                                IFF(count(*) = (SELECT count FROM territories_in_registry_count), TRUE, FALSE) AS star_carveout
                            FROM combined_territories
                            GROUP BY 1, 2
                        ),
                        track_rules AS (
                            WITH unfiltered_track_rules AS (
                                SELECT
                                    ct.service_name,
                                    ft.tuid,
                                    LISTAGG(DISTINCT(ct.territory_carveouts), ',') WITHIN GROUP (
                                        ORDER BY
                                            territory_carveouts
                                    ) AS territory_carveouts,
                                    rldsc.star_carveout OR aatco.star_carveout AS star_carveout,
                                    LISTAGG(DISTINCT(existing_territory_rules.TERRITORY), ',') WITHIN GROUP (
                                        ORDER BY
                                            existing_territory_rules.TERRITORY
                                    ) AS territory_rules,
                                    existing_star_carveouts.SERVICE IS NOT NULL AS star_rule
                                FROM
                                    filtered_track_ids ft
                                    INNER JOIN combined_territories ct ON ft.tuid = ct.tuid
                                    INNER JOIN release_level_dms_star_carveouts rldsc ON ft.tuid = rldsc.tuid AND ct.service_name = rldsc.service_name
                                    INNER JOIN are_all_territories_carved_out aatco ON ct.tuid = aatco.tuid AND ct.service_name = aatco.service_name
                                    LEFT JOIN FACTS.<SCHEMA_NAME>.HAS_FINGERPRINT_RULE AS existing_territory_rules 
                                        ON TRY_TO_NUMBER(existing_territory_rules.ORCHARD_OBJ_ID) = ft.tuid
                                        AND existing_territory_rules.ORCHARD_OBJ_TYPE = 'Track'
                                        AND existing_territory_rules.SERVICE = ct.service_name
                                        AND existing_territory_rules."POLICY" = 'carveout'
                                        AND existing_territory_rules.TERRITORY != '*'
                                    LEFT JOIN FACTS.<SCHEMA_NAME>.HAS_FINGERPRINT_RULE AS existing_star_carveouts 
                                        ON TRY_TO_NUMBER(existing_star_carveouts.ORCHARD_OBJ_ID) = ft.tuid
                                        AND existing_star_carveouts.ORCHARD_OBJ_TYPE = 'Track'
                                        AND existing_star_carveouts.SERVICE = ct.service_name
                                        AND existing_star_carveouts."POLICY" = 'carveout'
                                        AND existing_star_carveouts.TERRITORY = '*'
                                GROUP BY
                                    1, 2, 4, 6
                            )
                            SELECT
                                *
                            FROM
                                unfiltered_track_rules
                            WHERE
                                (
                                    unfiltered_track_rules.star_carveout = TRUE
                                    AND unfiltered_track_rules.star_rule = FALSE
                                )
                                OR (
                                    unfiltered_track_rules.star_carveout = FALSE
                                    AND unfiltered_track_rules.territory_carveouts != unfiltered_track_rules.territory_rules
                                )
                        )
                        SELECT
                            CONCAT('tuid:', tuid) AS KEY,
                            ARRAY_AGG(
                                OBJECT_CONSTRUCT(
                                    'territory_carveouts',
                                    TERRITORY_CARVEOUTS,
                                    'star_carveout',
                                    STAR_CARVEOUT,
                                    'territory_rules',
                                    TERRITORY_RULES,
                                    'star_rule',
                                    STAR_RULE,
                                    'service',
                                    SERVICE_NAME
                                )
                            ) WITHIN GROUP (
                                ORDER BY
                                    SERVICE_NAME
                            ) AS VALUE
                        FROM
                            track_rules
                        GROUP BY 1
                        ORDER BY 1
                ]]>
            </sqlquery>
        </precondition>
    </changeset>
</changelog>
