OPTIONAL MATCH (p:Participant:Chartmetric {chartmetricId: event.CM_ARTIST_ID})
WITH event, p
FOREACH (n IN (CASE WHEN event.ISRC IS NOT NULL THEN [1] ELSE [] END) |
    MERGE (gsr:GlobalSoundRecording {isrc: event.ISRC})
        ON CREATE SET
            gsr.id = randomUUID(),
            gsr.createdAt = datetime(),
            gsr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon',
            gsr.name = event.SOUND_RECORDING_NAME,
            gsr.types = ['music'],
            gsr.imageUrl = COALESCE(gsr.imageUrl, event.SOUND_RECORDING_IMAGE_URL)
        ON MATCH SET
            gsr.lastModifiedAt = datetime(),
            gsr.lastModifiedBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon',
            gsr.name = COALESCE(gsr.name, event.SOUND_RECORDING_NAME),
            gsr.types = apoc.coll.sort(apoc.coll.union(gsr.types, ['music'])),
            gsr.imageUrl = COALESCE(gsr.imageUrl, event.SOUND_RECORDING_IMAGE_URL)
    MERGE (sr:SoundRecording:Chartmetric:PublicSoundRecording {isrc: event.ISRC})
        ON CREATE SET
            sr.name = event.SOUND_RECORDING_NAME,
            sr.imageUrl = event.SOUND_RECORDING_IMAGE_URL,
            sr.artist = event.AMAZON_ARTIST_NAME,
            sr.id = randomUUID(),
            sr.createdAt = datetime(),
            sr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
        ON MATCH SET
            sr.name = COALESCE(event.SOUND_RECORDING_NAME, gsr.name),
            sr.imageUrl = event.SOUND_RECORDING_IMAGE_URL,
            sr.artist = event.AMAZON_ARTIST_NAME,
            sr.lastModifiedAt = datetime(),
            sr.lastModifiedBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    MERGE (t:Track:ChartmetricAmazon:PublicTrack {amazonId: event.AMAZON_TRACK_ID})
        ON CREATE SET
            t.name = event.TRACK_NAME,
            t.isrc = event.ISRC,
            t.id = randomUUID(),
            t.createdAt = datetime(),
            t.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
        ON MATCH SET
            t.name = event.TRACK_NAME,
            t.isrc = event.ISRC,
            t.lastModifiedAt = datetime(),
            t.lastModifiedBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    MERGE (pr:Product:ChartmetricAmazon:PublicProduct {amazonId: event.AMAZON_ALBUM_ID})
        ON CREATE SET
            pr.name = event.PRODUCT_NAME,
            pr.imageUrl = event.PRODUCT_IMAGE_URL,
            pr.upc = event.UPC,
            pr.releaseDate = date(event.RELEASE_DATE),
            pr.id = randomUUID(),
            pr.createdAt = datetime(),
            pr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
        ON MATCH SET
            pr.name = event.PRODUCT_NAME,
            pr.imageUrl = event.PRODUCT_IMAGE_URL,
            pr.upc = event.UPC,
            pr.releaseDate = date(event.RELEASE_DATE),
            pr.lastModifiedAt = datetime(),
            pr.lastModifiedBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    FOREACH (n IN (CASE WHEN event.LABEL IS NOT NULL THEN [1] ELSE [] END) |
        MERGE (l:Label:ChartmetricAmazon:PublicLabel {name: event.LABEL})
            ON CREATE SET
                l.id = randomUUID(),
                l.createdAt = datetime(),
                l.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
        MERGE (l)-[lToPr:OWNS_PRODUCT]->(pr)
            ON CREATE SET
                lToPr.createdAt = datetime(),
                lToPr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    )
    MERGE (t)-[tToSr:IS_PLACEMENT_OF]->(sr)
        ON CREATE SET
            tToSr.createdAt = datetime(),
            tToSr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    MERGE (pr)-[prToT:INCLUDES]->(t)
        ON CREATE SET
            prToT.createdAt = datetime(),
            prToT.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    MERGE (gsr)-[gsrToSr:REPRESENTS]->(sr)
        ON CREATE SET
            gsrToSr.createdAt = datetime(),
            gsrToSr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    FOREACH (_ IN CASE WHEN p IS NOT NULL THEN [1] END |
        MERGE (p)-[pToSr:PARTICIPATED_IN]->(sr)
            ON CREATE SET
                pToSr.createdAt = datetime(),
                pToSr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    )
)
FOREACH (n IN (CASE WHEN event.ISRC IS NULL THEN [1] ELSE [] END) |
    MERGE (sr:SoundRecording:Chartmetric:PublicSoundRecording {trackId: toString(event.AMAZON_TRACK_ID)})
        ON CREATE SET
            sr.name = event.TRACK_NAME,
            sr.artist = event.AMAZON_ARTIST_NAME,
            sr.id = randomUUID(),
            sr.createdAt = datetime(),
            sr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
        ON MATCH SET
            sr.name = event.TRACK_NAME,
            sr.artist = event.AMAZON_ARTIST_NAME,
            sr.lastModifiedAt = datetime(),
            sr.lastModifiedBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    MERGE (t:Track:ChartmetricAmazon:PublicTrack {amazonId: event.AMAZON_TRACK_ID})
        ON CREATE SET
            t.name = event.TRACK_NAME,
            t.isrc = event.ISRC,
            t.id = randomUUID(),
            t.createdAt = datetime(),
            t.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
        ON MATCH SET
            t.name = event.TRACK_NAME,
            t.isrc = event.ISRC,
            t.lastModifiedAt = datetime(),
            t.lastModifiedBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    MERGE (pr:Product:ChartmetricAmazon:PublicProduct {amazonId: event.AMAZON_ALBUM_ID})
        ON CREATE SET
            pr.name = event.PRODUCT_NAME,
            pr.imageUrl = event.PRODUCT_IMAGE_URL,
            pr.upc = event.UPC,
            pr.releaseDate = date(event.RELEASE_DATE),
            pr.id = randomUUID(),
            pr.createdAt = datetime(),
            pr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
        ON MATCH SET
            pr.name = event.PRODUCT_NAME,
            pr.imageUrl = event.PRODUCT_IMAGE_URL,
            pr.upc = event.UPC,
            pr.releaseDate = date(event.RELEASE_DATE),
            pr.lastModifiedAt = datetime(),
            pr.lastModifiedBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    FOREACH (n IN (CASE WHEN event.LABEL IS NOT NULL THEN [1] ELSE [] END) |
        MERGE (l:Label:ChartmetricAmazon:PublicLabel {name: event.LABEL})
            ON CREATE SET
                l.id = randomUUID(),
                l.createdAt = datetime(),
                l.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
        MERGE (l)-[lToPr:OWNS_PRODUCT]->(pr)
            ON CREATE SET
                lToPr.createdAt = datetime(),
                lToPr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    )
    MERGE (t)-[tToSr:IS_PLACEMENT_OF]->(sr)
        ON CREATE SET
            tToSr.createdAt = datetime(),
            tToSr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    MERGE (pr)-[prToT:INCLUDES]->(t)
        ON CREATE SET
            prToT.createdAt = datetime(),
            prToT.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    FOREACH (_ IN CASE WHEN p IS NOT NULL THEN [1] END |
        MERGE (p)-[pToSr:PARTICIPATED_IN]->(sr)
            ON CREATE SET
                pToSr.createdAt = datetime(),
                pToSr.createdBy = 'kc-neo-cdc-sink-cmt/etl_chartmetric_tracks_amazon'
    )
)
