package util;

import com.google.protobuf.InvalidProtocolBufferException;
import meerkat.ProtobufsMessages;
import meerkat.VoterRegistryMessage;
import meerkat.protobuf.BulletinBoardAPI;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by Vladimir Eliezer Tokarev  on 1/15/2016.
 * adds extra functionality to Messages collections
 */
public abstract class CollectionMessagesUtils {

    /**
     * Converts lost of BasicMessages to VoterRegistryMessags
     * @param messages list<BasicMessages>
     * @return List<VoterRegistryMessage>
     */
   public static List<VoterRegistryMessage> ConvertToVoterRegistryMessages(List<ProtobufsMessages.BasicMessage> messages){
       List<VoterRegistryMessage> voterRegistryMessages = new ArrayList<VoterRegistryMessage>();
       for (ProtobufsMessages.BasicMessage message : messages){
           voterRegistryMessages.add(new VoterRegistryMessage(message));
       }
      return voterRegistryMessages;
   }

    /**
     * Gets map of GroupId to basicMessage, where the basicMessages are the last actions for those groups
     * @param messages List<BasicMessages>
     * @return Map<String, VoterRegistryMessage>
     * @throws ParseException
     */
    public static Map<String, VoterRegistryMessage> GetLatestGroupsActions(List<VoterRegistryMessage> messages) throws ParseException {

            Map<String, VoterRegistryMessage> groupIdToMessage = new HashMap<String, VoterRegistryMessage>();

        // iterate trough all the messages and put into the map the last updated groups actions

        for (int i = 0; i < messages.size(); i++) {
            String groupId = messages.get(i).GetWantedTagFromBasicMessage(Tags.GROUP_ID_TAG);
            VoterRegistryMessage temp = groupIdToMessage.get(groupId);

            if (temp != null) {
                if (temp != messages.get(i)) {
                    if (temp.GetBasicMessageActionTimestamp().before(messages.get(i).GetBasicMessageActionTimestamp())) {
                        groupIdToMessage.put(groupId, messages.get(i));
                    }
                }
            }
        }

        return groupIdToMessage;
    }

    /**
     * Gets list of groups ids of the basicMessages that carried the adding to group tag
     * @param groupIdToMessage Map<String, BasicMessage>
     * @return List<String>
     */
     public static List<String> GetListOfGroupIds(Map<String, VoterRegistryMessage>  groupIdToMessage)  {
        List<String> groupsIds = new ArrayList<String>();

        for (VoterRegistryMessage message : groupIdToMessage.values()) {
            if (message.IsGroupAdding()) {
                String groupId = message.GetWantedTagFromBasicMessage(Tags.GROUP_ID_TAG);
                groupsIds.add(groupId);
            }
        }
        return groupsIds;
    }

    /**
     * Gets all the basic messages from bulletin board messages
     * @param listOfMessages
     * @return List<BasicMessage> G
     * @throws InvalidProtocolBufferException
     */
    public static final List<ProtobufsMessages.BasicMessage> GetBasicMessagesFromBulletinBoardMessages(
            List<BulletinBoardAPI.BulletinBoardMessage> listOfMessages) throws InvalidProtocolBufferException {

        List<ProtobufsMessages.BasicMessage> basicMessages = new ArrayList<ProtobufsMessages.BasicMessage>();

        for (BulletinBoardAPI.BulletinBoardMessage bulletinBoardMessage : listOfMessages){
            ProtobufsMessages.BasicMessage.Builder basicMessage =
                    ProtobufsMessages.BasicMessage.newBuilder().mergeFrom(bulletinBoardMessage.getMsg().getData());
            basicMessages.add(basicMessage.build());
        }

        return basicMessages;
    }
}