<?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-366_all_subaccount_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_subaccount_ids AS (
                        SELECT DISTINCT(dp.SUBACCOUNTID) AS subaccount_id
                        FROM FACTS.<SCHEMA_NAME>.DIM_TRACK_CLEAN_MV dtc
                        JOIN FACTS.<SCHEMA_NAME>.DIM_RELEASE dr ON dtc.UPC = dr.RELEASEID
                        JOIN FACTS.<SCHEMA_NAME>.DIM_PROJECT dp ON dr.PROJECTID = dp.PROJECTID
                        WHERE dp.SUBACCOUNTID IS NOT NULL
                        AND TRACK_UNIQUE_ID IN (SELECT DISTINCT(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
                    ),
                    per_territory AS (
                        SELECT
                            str.SUBACCOUNT_ID AS subaccount_id,
                            sitn.service_name AS service_name,
                            cou.COUNTRY_CODE AS territory_carveouts
                        FROM
                            ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.SUBACCOUNT_TERRITORY_RESTRICTION AS str
                            INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.COUNTRY AS cou ON cou.ID = str.COUNTRY_ID
                            INNER JOIN territories_in_registry tir ON cou.COUNTRY_CODE = tir.TERRITORY
                            FULL OUTER JOIN service_ids_to_names sitn
                        GROUP BY
                            1, 2, 3
                    ),
                    per_service_per_territory AS (
                        SELECT
                            sar.SUBACCOUNT_ID AS subaccount_id,
                            sitn.service_name AS service_name,
                            cou.COUNTRY_CODE AS territory_carveouts
                        FROM
                            ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.SUBACCOUNT_DMS_RESTRICTION AS sar
                            INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.CUSTOMER_MASTER AS cm 
                                ON sar.DMS_ID = cm.CUSTOMER_ID
                            INNER JOIN service_ids_to_names sitn
                                ON cm.CUSTOMER_MASTER_MASTER_ID = sitn.service_id
                            INNER JOIN ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.COUNTRY AS cou 
                                ON cou.ID = cm.TERRITORY
                            INNER JOIN territories_in_registry tir 
                                ON cou.COUNTRY_CODE = tir.TERRITORY
                        GROUP BY
                            1, 2, 3
                    ),
                    combined_territories AS (
                        SELECT * FROM (
                            SELECT * FROM per_territory
                            UNION
                            SELECT * FROM per_service_per_territory
                        )
                        GROUP BY 1, 2, 3
                    ),
                    are_all_territories_carved_out AS (
                        SELECT 
                            service_name,
                            subaccount_id,
                            IFF(count(*) = (SELECT count FROM territories_in_registry_count), TRUE, FALSE) AS star_carveout
                        FROM combined_territories
                        GROUP BY 1, 2
                    ),
                    subaccount_rules AS (
                        WITH results AS (
                            WITH 
                            star AS (
                                SELECT
                                    samr.SUBACCOUNT_ID AS subaccount_id,
                                    samr.CUSTOMER_MASTER_MASTER_ID AS service_id
                                FROM
                                    ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.SUBACCOUNT_DMS_MASTER_RESTRICTION AS samr
                                WHERE
                                    samr.CUSTOMER_MASTER_MASTER_ID IN (
                                        SELECT
                                            service_id
                                        FROM
                                            service_ids_to_names
                                    )
                                GROUP BY
                                    1, 2
                            )
                            SELECT
                                sitn.service_name,
                                sa.SUBACCOUNT_ID,
                                LISTAGG(DISTINCT(ct.territory_carveouts), ',') WITHIN GROUP (
                                    ORDER BY
                                        territory_carveouts
                                ) AS territory_carveouts,
                                star.subaccount_id IS NOT NULL OR aatco.star_carveout AS star_carveout,
                                LISTAGG(DISTINCT(hr1.TERRITORY), ',') WITHIN GROUP (
                                    ORDER BY
                                        hr1.TERRITORY
                                ) AS territory_rules,
                                hr2.SERVICE IS NOT NULL AS star_rule
                            FROM
                                ORCHARD_APP_REPORTING_V2.ART_RELATIONS_PROD_ART_RELATIONS.SUBACCOUNT AS sa
                                FULL OUTER JOIN service_ids_to_names AS sitn
                                INNER JOIN combined_territories ct 
                                    ON sa.subaccount_id = ct.subaccount_id
                                INNER JOIN are_all_territories_carved_out aatco
                                    ON sa.subaccount_id = aatco.subaccount_id
                                    AND sitn.service_name = aatco.service_name
                                LEFT JOIN star 
                                    ON star.subaccount_id = sa.subaccount_id
                                    AND star.service_id = sitn.service_id
                                LEFT JOIN FACTS.<SCHEMA_NAME>.HAS_FINGERPRINT_RULE AS hr1
                                ON TRY_TO_NUMBER(hr1.ORCHARD_OBJ_ID) = sa.SUBACCOUNT_ID
                                AND hr1.ORCHARD_OBJ_TYPE IN ('SubAccount', 'Subaccount')
                                AND hr1.SERVICE = sitn.service_name
                                AND hr1."POLICY" = 'carveout'
                                AND ENDSWITH(hr1.CREATED_BY, '/179/OrchAdminProfile')
                                LEFT JOIN FACTS.<SCHEMA_NAME>.HAS_FINGERPRINT_RULE AS hr2
                                ON TRY_TO_NUMBER(hr2.ORCHARD_OBJ_ID) = sa.SUBACCOUNT_ID
                                AND hr2.ORCHARD_OBJ_TYPE IN ('SubAccount', 'Subaccount')
                                AND hr2.SERVICE = sitn.service_name
                                AND hr2."POLICY" = 'carveout'
                                AND hr2.TERRITORY = '*'
                                AND ENDSWITH(hr2.CREATED_BY, '/179/OrchAdminProfile')
                            WHERE
                                sa.SUBACCOUNT_ID IN (SELECT subaccount_id FROM filtered_subaccount_ids)
                            GROUP BY
                                all
                        ), subaccount_ids_to_sync AS (
                            SELECT
                                DISTINCT(results.subaccount_id) AS subaccount_id
                            FROM
                                results
                            WHERE
                                (
                                    results.star_carveout = TRUE
                                    AND results.star_rule = FALSE
                                )
                                OR (
                                    results.star_carveout = FALSE
                                    AND results.territory_carveouts != results.territory_rules
                                )
                        )
                        SELECT
                            *
                        FROM
                            results
                        WHERE
                            subaccount_id IN (SELECT subaccount_id FROM subaccount_ids_to_sync)
                    )
                    SELECT
                        CONCAT('subaccount_id:', subaccount_id) 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
                        subaccount_rules
                    GROUP BY
                        1
                    ORDER BY
                        1
                ]]>
            </sqlquery>
        </precondition>
    </changeset>
</changelog>
