package Communication;

import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import meerkat.protobuf.DKGMessages;

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * Created by Tzlil on 2/14/2016.
 */
public class User{
    protected final MailHandler mailHandler;
    protected final Queue<DKGMessages.Mail> mailbox;
    protected final int ID;
    protected final Thread receiverThread;
    private final Network network;

    protected User(int ID, Network network, MailHandler mailHandler) {
        this.mailbox = new ArrayBlockingQueue<DKGMessages.Mail>(2 * network.n * network.n);
        this.ID = ID;
        this.mailHandler = mailHandler;
        this.receiverThread = new Thread(new Receiver());
        this.network = network;
    }

    public boolean send(int id, DKGMessages.Mail.Type type, Message message){
        return network.sendMessage(this,id,type,message);
    }

    public void broadcast(DKGMessages.Mail.Type type, Message message){
        network.sendBroadcast(this,type,message);
    }
    public MailHandler getMailHandler(){
        return mailHandler;
    }
    public void setMessageHandler(MessageHandler messageHandler) {
        mailHandler.setMessageHandler(messageHandler);
    }

    public int getID() {
        return ID;
    }
    public Thread getReceiverThread(){
        return receiverThread;
    }
    private class Receiver implements Runnable{
        @Override
        public void run() {
            while (true){
                if (!mailbox.isEmpty()){
                    mailHandler.handel(mailbox.poll());
                }else{
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        // do nothing
                    }
                }
            }
        }
    }


}