#!/usr/bin/env python
'''
Copyright (C) 2012, Digium, Inc.
Kinsey Moore <kmoore@digium.com>

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

import sys
import logging

from twisted.internet import reactor

sys.path.append("lib/python")
from asterisk.asterisk import Asterisk
from asterisk.test_case import TestCase

logger = logging.getLogger(__name__)

class HUCTest(TestCase):
    def __init__(self):
        TestCase.__init__(self)
        self.create_asterisk(2)
        self.event_count = 0
        self.success_count = 0

    def ami_connect(self, ami):
        if ami.id == 0:
            logger.info("Initiating three test calls for single, branched, and local with branched")
            self.ami[0].originate("local/1111@dial-alice", "dpwait", "1234", 1).addErrback(self.handle_originate_failure)
            self.ami[0].originate("local/2222@dial-alice", "dpwait", "1234", 1).addErrback(self.handle_originate_failure)
            self.ami[0].originate("local/3333@dial-alice", "dpwait", "1234", 1).addErrback(self.handle_originate_failure)
        else:
            self.ami[1].registerEvent('UserEvent', self.huc_callback)

    def huc_callback(self, ami, event):
        if event['userevent'] != 'HUCStatus':
            return

        self.event_count += 1
        error = 0

        def res_good(chan, res):
            if event['chan1'].find("alice") != -1:
                if event['res1'].find('SIP 503') == -1:
                    return False
            else:
                if event['res1'].find('SIP 486') == -1:
                    return False
            return True

        if res_good(event['chan1'], event['res1']):
            if event['status'] == "single":
                logger.info("got result for single channel call")
                if event['hangupcause'] == '34':
                    self.success_count += 1
                else:
                    logger.error("Received 'single' event with bad HANGUPCAUSE code")
            elif event ['status'] == "double":
                logger.info("got result for branched call")
                if event['hangupcause'] == '17' and\
                        res_good(event['chan2'], event['res2']):
                    self.success_count += 1
                else:
                    logger.error("Received 'double' event with bad cause information")
            elif event ['status'] == "local":
                logger.info("got result for local-indirected branched call")
                if event['hangupcause'] == '0' and\
                        res_good(event['chan2'], event['res2']):
                    self.success_count += 1
                else:
                    logger.error("Received 'local' event with bad cause information")
        else:
            logger.error("Received '%s' event with bad cause information" % (event['status']))

        self.are_we_there_yet()

    def are_we_there_yet(self):
        if self.event_count >= 3:
            if self.success_count == 3:
                self.passed = True
            self.stop_reactor()

    def run(self):
        TestCase.run(self)
        self.create_ami_factory(2)


def main():
    test = HUCTest()
    reactor.run()

    if not test.passed:
        return 1

    return 0

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

