public class DKR extends Process implements Election {
    public enum State {ASLEEP,PASSIVE, ACTIVE};
    int myNum, leaderId = -1;
    State state = State.PASSIVE;
    int maxNum, neiborR;
    int next;
    public DKR(MsgHandler initComm,  int number) {
        super(initComm);
        this.myNum = number;
        maxNum = myNum;
        next = (myId + 1) % n;
    }
    public synchronized int getLeader(){
            while(leaderId == -1) myWait();
            return leaderId;
    }
    public synchronized void handleMsg(Msg m, int src, String tag) {
        if (state == State.ASLEEP) startElection();
        int rNum = m.getMessageInt();
        if (tag.equals("type1")) {
            if(state == State.ACTIVE){
                if(rNum != maxNum){
                    sendMsg(next, "type2", rNum);
                    neiborR = rNum;
                }
                else{
                   leaderId = rNum;
                   sendMsg(next, "leader", rNum);
                }
            }
            else sendMsg(next, "type1",rNum);
        }
        else if (tag.equals("type2")) {
            if(state == State.ACTIVE){
                if((neiborR > rNum) && (neiborR > maxNum)){
                    maxNum = neiborR;
                    sendMsg(next, "type1", neiborR);
                }
                else state = State.PASSIVE;
            }
            else sendMsg(next, "type2" ,rNum);
        }
        else if ((tag.equals("leader")) && (leaderId == -1)) {
                   leaderId = rNum;
                   sendMsg(next, "leader", rNum);
         }
    }
    public synchronized void startElection(){
        if (state == State.ASLEEP) {
           state = State.ACTIVE;
           sendMsg(next, "type1", myNum);
        }
    }
}