<?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-353_all_track_lvl_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 DISTINCT(tuid) AS tuid FROM FACTS.<SCHEMA_NAME>.REGISTRY
                    ),
                    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 != '*'
                                    AND ENDSWITH(existing_territory_rules.CREATED_BY, '/179/OrchAdminProfile')
                                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 = '*'
                                    AND ENDSWITH(existing_star_carveouts.CREATED_BY, '/179/OrchAdminProfile')
                            GROUP BY
                                1, 2, 4, 6
                        ),
                        tuids_to_sync AS (
                            SELECT
                                DISTINCT(TUID) AS TUID
                            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
                            *
                        FROM
                            unfiltered_track_rules
                        WHERE
                            tuid IN (SELECT tuid FROM tuids_to_sync)
                    )
                    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>
