package com.orchard.models;

import java.util.List;
import java.util.stream.Collectors;
import org.apache.kafka.connect.data.Schema;
import org.apache.kafka.connect.data.SchemaBuilder;
import org.apache.kafka.connect.data.Struct;

public class GlobalParticipantStreams implements OrchardModel {
    public String globalParticipantUuid;

    public String name;

    public String imageUrl;

    public String countryCode;

    public Boolean hasPublicData;

    public String createdAt;

    public String lastModifiedAt;

    public Stats stats;

    public GPSocialAccountIds socialAccountIds;

    public List<LabelParticipant> labelParticipants;

    public static final Schema KafkaSchema = SchemaBuilder.struct().optional()
            .field("globalParticipantUuid", Schema.OPTIONAL_STRING_SCHEMA)
            .field("name", Schema.OPTIONAL_STRING_SCHEMA)
            .field("imageUrl", Schema.OPTIONAL_STRING_SCHEMA)
            .field("countryCode", Schema.OPTIONAL_STRING_SCHEMA)
            .field("hasPublicData", Schema.OPTIONAL_BOOLEAN_SCHEMA)
            .field("createdAt", Schema.OPTIONAL_STRING_SCHEMA)
            .field("lastModifiedAt", Schema.OPTIONAL_STRING_SCHEMA)
            .field("stats", com.orchard.models.Stats.KafkaSchema)
            .field("socialAccountIds", com.orchard.models.GPSocialAccountIds.KafkaSchema)
            .field("labelParticipants",  SchemaBuilder.
                array(LabelParticipant.KafkaSchema).optional()
                .build())
            .build();

    public Struct ToKafkaStruct() {
        return new Struct(KafkaSchema)
                .put("globalParticipantUuid", globalParticipantUuid)
                .put("name", name)
                .put("imageUrl", imageUrl)
                .put("countryCode", countryCode)
                .put("hasPublicData", hasPublicData)
                .put("createdAt", createdAt)
                .put("lastModifiedAt", lastModifiedAt)
                .put("stats", stats.ToKafkaStruct())
                .put("socialAccountIds", socialAccountIds.ToKafkaStruct())
                .put("labelParticipants",
                        labelParticipants.stream()
                        .map(lp -> lp.ToKafkaStruct()).collect(Collectors.toList()));
    }
}
