package com.orchard.models;

import static org.junit.jupiter.api.Assertions.assertEquals;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import org.apache.kafka.connect.data.Struct;
import org.junit.jupiter.api.Test;

public class GlobalParticipantStreamsTests {
    public static final String GlobalParticipantStreamsJson =
            "{\"globalParticipantUuid\":\"uuid123\","
                + "\"name\":\"test\","
                + "\"imageUrl\":\"testurl\","
                + "\"countryCode\":\"US\","
                + "\"hasPublicData\":true,"
                + "\"createdAt\":\"testdate\","
                + "\"lastModifiedAt\":\"testdate\","
                + "\"stats\":"
                + "{\"followers\":1,"
                + "\"monthlyListeners\":2,"
                + "\"popularity\":3,"
                + "\"views\":4},"
                + "\"socialAccountIds\":"
                + "{\"spotify\":\"testspotifyid\","
                + "\"appleMusic\":\"testappleid\","
                + "\"chartmetric\":1},"
                    + "\"labelParticipants\":["
                    + LabelParticipantTests.LabelParticipantJson
                    + "]}";

    public static GlobalParticipantStreams CreateGlobalParticipantStreams()
    {
        GlobalParticipantStreams globalParticipantStreams = new GlobalParticipantStreams();
        globalParticipantStreams.labelParticipants = new ArrayList<LabelParticipant>();
        globalParticipantStreams.globalParticipantUuid = "uuid123";
        globalParticipantStreams.name = "test";
        globalParticipantStreams.countryCode = "US";
        globalParticipantStreams.imageUrl = "testurl";
        globalParticipantStreams.hasPublicData = true;

        globalParticipantStreams.stats = new Stats();
        globalParticipantStreams.stats.followers = 1;
        globalParticipantStreams.stats.monthlyListeners = 2;
        globalParticipantStreams.stats.popularity = 3;
        globalParticipantStreams.stats.views = 4;

        globalParticipantStreams.socialAccountIds = new GPSocialAccountIds();
        globalParticipantStreams.socialAccountIds.spotify = "testspotifyid";
        globalParticipantStreams.socialAccountIds.appleMusic = "testappleid";
        globalParticipantStreams.socialAccountIds.chartmetric = 1;

        globalParticipantStreams.labelParticipants.add(LabelParticipantTests.CreateLabelParticipant());
        return globalParticipantStreams;
    }

    @Test
    public void shouldReturnValidKafkaStruct() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        GlobalParticipantStreams globalParticipantStreamsParsed = mapper.readValue(
                GlobalParticipantStreamsJson, GlobalParticipantStreams.class);
        GlobalParticipantStreams globalParticipantStreams = CreateGlobalParticipantStreams();
        Struct kafkaStruct = globalParticipantStreams.ToKafkaStruct();

        assertEquals(
                globalParticipantStreamsParsed.globalParticipantUuid,
                kafkaStruct.getString("globalParticipantUuid"));

        // We already tested LabelParticipant and LabelSoundRecording deserialization
        // in other test, so comparing only the item count here.
        assertEquals(
                globalParticipantStreamsParsed.labelParticipants.size(),
                kafkaStruct.getArray("labelParticipants").size()
        );
        assertEquals(
                globalParticipantStreamsParsed.labelParticipants.size(),
                kafkaStruct.getArray("labelParticipants").size()
        );

        assertEquals(
                globalParticipantStreamsParsed.name,
                kafkaStruct.getString("name"));
        assertEquals(
                globalParticipantStreamsParsed.imageUrl,
                kafkaStruct.getString("imageUrl"));
        assertEquals(
                globalParticipantStreamsParsed.countryCode,
                kafkaStruct.getString("countryCode"));
        assertEquals(
                globalParticipantStreamsParsed.hasPublicData,
                kafkaStruct.getBoolean("hasPublicData"));

        Struct statsStruct = kafkaStruct.getStruct("stats");
        assertEquals(
                globalParticipantStreamsParsed.stats.followers,
                statsStruct.getInt64("followers"));
        assertEquals(
                globalParticipantStreamsParsed.stats.monthlyListeners,
                statsStruct.getInt64("monthlyListeners"));
        assertEquals(
                globalParticipantStreamsParsed.stats.popularity,
                statsStruct.getInt64("popularity"));
        assertEquals(
                globalParticipantStreamsParsed.stats.views,
                statsStruct.getInt64("views"));

        Struct socialAccountIdsStruct = kafkaStruct.getStruct("socialAccountIds");
        assertEquals(
                globalParticipantStreamsParsed.socialAccountIds.spotify,
                socialAccountIdsStruct.getString("spotify"));
        assertEquals(
                globalParticipantStreamsParsed.socialAccountIds.appleMusic,
                socialAccountIdsStruct.getString("appleMusic"));
        assertEquals(
                globalParticipantStreamsParsed.socialAccountIds.chartmetric,
                socialAccountIdsStruct.getInt64("chartmetric"));

    }
}
