#!/usr/bin/env python
# vim: sw=3 et:
'''
Copyright (C) 2011-2013, Digium, Inc.
Matt Jordan <mjordan@digium.com>

Ported from original lua queue_baseline test by Matt Nicholson

This program is free software, distributed under the terms of
the GNU General Public License Version 2.
'''

import sys
import os
import logging


from twisted.internet import reactor

sys.path.append("lib/python")

from asterisk.test_case import TestCase
from asterisk.version import AsteriskVersion

logger = logging.getLogger(__name__)


class QueueBaseline(TestCase):

    def __init__(self):
        super(QueueBaseline, self).__init__()
        self.ast_version = AsteriskVersion()

        if self.ast_version < AsteriskVersion("12"):
            join = "Join"
            leave = "Leave"
        else:
            join = "QueueCallerJoin"
            leave = "QueueCallerLeave"

        self.expected_events = {
            join: False,
            "AgentCalled": False,
            "AgentConnect": False,
            leave: False,
            "AgentComplete": False
            }
        self.events_received = 0
        self.create_asterisk()

    def run(self):
        super(QueueBaseline, self).run()
        self.create_ami_factory()

    def ami_connect(self, ami):
        """ Register for all events we care about """
        for event in self.expected_events:
            logger.debug("Registering for %s" % event)
            ami.registerEvent(event, self.queue_event)

        df = ami.originate(channel = "Local/test@test_context", exten = "queue", context = "test_context", priority = 1)
        df.addErrback(self.handle_originate_failure)

    def queue_event(self, ami, event):
        if event['event'] in self.expected_events:
            logger.info("Received expected event %s" % event['event'])
            self.events_received += 1
            self.expected_events[event['event']] = True
            if self.events_received == len(self.expected_events):
                logger.info("Received all expected events; stopping")
                self.passed = True
                self.stop_reactor()
        else:
            logger.debug("Passing on non-expected event %s" % event['event'])


def main():
    test = QueueBaseline()
    test.start_asterisk()
    reactor.run()
    test.stop_asterisk()

    if not test.passed:
        """ We missed an event - query the test to find out which one """
        for event in test.expected_events:
            if not test.expected_events[event]:
                logger.error("Test failed: did not receive expected event %s" % event)
        return 1

    return 0

if __name__ == "__main__":
   sys.exit(main() or 0)
