def agent_registration(request):
    """ Registers an active agent for the call center. """
    try:
        log.info("retrieved agent ANI:" + request.POST['agentANI'])
        assert(request.POST['agentANI'])        
        agentGateway = AgentGateway()
        #check if agent is already active
        if(agentGateway.isANICurrentlyActive(request.POST['agentANI'])):
            #agent already active
            log.info("agent_registration: agent already active ani: " + request.POST['agentANI'])
            return HttpResponse('registration.agent_already_active')
        else:
            #INSERT INTO DB
            log.info("about to call registerAgentForServiceToday()")
            agentGateway.registerAgentForServiceToday(request.POST['agentANI'])
            log.info("registered agent")      
            return HttpResponse('registration.successful')                
    except Exception as e:
        log.error("Module: views.agent_registration. Error: " + e)
        return HttpResponse('registration.unsuccessful')
class AgentGatewayTest(unittest.TestCase):
    """ Provides function coverage for AgentGateway. """

    def setUp(self):
        self.ANI = "212555555" + str(random.randrange(9))
        self.AgentGateway = AgentGateway()
        self.CallGateway = CallGateway()
        self.today = datetime.datetime.today()
        self.agentToInsert = None
        self.activeAgents = []
        self.activeCalls = []

    def tearDown(self):
        if self.agentToInsert:
            self.agentToInsert.delete()
        if len(self.activeAgents) > 0:
            for agent in self.activeAgents:
                agent.delete()
        if len(self.activeCalls) > 0:
            for call in self.activeCalls:
                call.delete()

    def test_registerAgent(self):
        self.agentToInsert = self.AgentGateway.registerAgentForServiceToday(self.ANI)

        # verify agent was inserted

        insertedAgent = Agents.objects.get(ani=self.ANI)

        self.assertTrue(insertedAgent)
        self.assertEqual(insertedAgent.ani, self.agentToInsert.ani)
        self.assertEqual(insertedAgent.connection_status, 1)
        self.assertEqual(insertedAgent.phone_status, 0)
        self.assertEqual(insertedAgent.added, self.agentToInsert.added)

    def test_getAvailableAgentsByIdleTime(self):
        # insert a bunch of agents
        self.activeAgents.append(
            self.AgentGateway.registerAgentForServiceToday("2125555560", connection=1, phone=0)
        )  # [0]
        self.activeAgents.append(
            self.AgentGateway.registerAgentForServiceToday("2125555561", connection=0, phone=0)
        )  # [1]
        self.activeAgents.append(
            self.AgentGateway.registerAgentForServiceToday("2125555562", connection=1, phone=1)
        )  # [2]
        self.activeAgents.append(
            self.AgentGateway.registerAgentForServiceToday("2125555563", connection=1, phone=1)
        )  # [3]
        self.activeAgents.append(
            self.AgentGateway.registerAgentForServiceToday("2125555564", connection=1, phone=0)
        )  # [4]
        self.activeAgents.append(
            self.AgentGateway.registerAgentForServiceToday("2125555565", connection=1, phone=0)
        )  # [5]
        # insert some calls
        now = datetime.datetime.now()
        self.activeCalls.append(
            self.CallGateway.addCall(agent=self.activeAgents[0], callEnd=(now + datetime.timedelta(seconds=50)))
        )  # call ended
        self.activeCalls.append(self.CallGateway.addCall(agent=self.activeAgents[2]))  # still on call
        self.activeCalls.append(self.CallGateway.addCall(agent=self.activeAgents[3]))  # still on call
        self.activeCalls.append(
            self.CallGateway.addCall(agent=self.activeAgents[4], callEnd=(now + datetime.timedelta(seconds=30)))
        )  # call ended
        self.activeCalls.append(
            self.CallGateway.addCall(agent=self.activeAgents[5], callEnd=(now + datetime.timedelta(seconds=60)))
        )  # call ended

        # get list of aviable agents
        # this returns unsorted list of hash containing agent ani and idle time
        # should have the following agents: 0,4,5
        avialableAgents = self.AgentGateway.getAvailableAgentsByIdleTime()
        self.assertEqual(len(avialableAgents), 3)

    def test_updateAgentPhoneStatus(self):
        self.agentToInsert = self.AgentGateway.registerAgentForServiceToday(self.ANI)
        self.assertEqual(self.agentToInsert.ani, self.ANI)
        # default phone status is 0
        self.assertEqual(self.agentToInsert.phone_status, 0)

        # change status
        modifiedAgent = self.AgentGateway.updateAgentPhoneStatus(self.agentToInsert, 1)

        self.assertEqual(modifiedAgent.ani, self.agentToInsert.ani)
        self.assertEqual(modifiedAgent.phone_status, 1)

    def test_unregisterAgentForServiceToday(self):
        self.agentToInsert = self.AgentGateway.registerAgentForServiceToday(self.ANI)
        # make sure agent is registered for service
        self.assertEqual(self.agentToInsert.ani, self.ANI)
        self.assertEqual(self.agentToInsert.connection_status, 1)

        # unregister
        unregedAgent = self.AgentGateway.unregisterAgentForServiceToday(self.ANI)

        self.assertEqual(self.agentToInsert.ani, unregedAgent.ani)
        self.assertEqual(unregedAgent.connection_status, 0)

    def test_isANICurrentlyActive(self):
        self.agentToInsert = self.AgentGateway.registerAgentForServiceToday(self.ANI)

        self.assertEqual(self.agentToInsert.ani, self.ANI)
        self.assertEqual(self.agentToInsert.connection_status, 1)

        self.assertEqual(self.AgentGateway.isANICurrentlyActive(self.ANI), True)