import MyRaft.state as state
import MyRaft.candidate as candidate
import MyRaft.raft_pb2 as raft_pb2

class Follower(state.State):
    def __init__(self, context):
        state.State.__init__(self, context)
        self._context.set_timeout(self._context._min_timout, self._context._vary_timeout)

    def heartbeat_elapsed(self):
        print("Becoming a candidate")
        self._context.set_state(candidate.Candidate(self._context))

    def rcv_AppendEntries(self, request):
        """Called when an append entries message is received"""

        self._context.set_timeout(self._context._min_timout, self._context._vary_timeout)

    def rcv_RequestVote(self, request):
        print("Received a vote request")
        # Ignoring log for now.
        if request.term < self._context.currentTerm:
            print("They're term is worse than ours.")
            # If our current term is already the same, then we must have voted already.
            return raft_pb2.RequestVoteResponse(term = self._context.currentTerm, voteGranted = False)
        elif request.term == self._context.currentTerm and self._context.votedFor is not None:
            return raft_pb2.RequestVoteResponse(term = self._context.currentTerm, voteGranted = False)
        else:
            print("We'll be voting for them!")
            # We vote yes, so reset our timeout.
            self._context.set_timeout(self._context._min_timout, self._context._vary_timeout)
            self._context.currentTerm = request.term
            print("setting candidate id")
            self._context.votedFor = request.candidateId
            print("Returning result.")
            return raft_pb2.RequestVoteResponse(term = self._context.currentTerm, 
                                                voteGranted = True,
                                                voterId = self._context._id)
    
