from log import *
from ivr import *
import xmlrpclib


XMLRPC_PROTOCOL = 'http'         # could e.g. be https
XMLRPC_SERVER   = 'localhost'
XMLRPC_PORT	= 23456
XMLRPC_DIR      = '/conf_auth'

HINT_TIMEOUT    = 10              # seconds until hint msg is played

server_path = XMLRPC_PROTOCOL + '://' +  XMLRPC_SERVER + \
		':' +  str(XMLRPC_PORT) +   XMLRPC_DIR

collect    = 0
connect    = 1
connected  = 2

HINT_TIMER   = 1
CONF_TIMER   = 2


def loopedTTS(str):
	af = IvrAudioFile.tts(str)
	af.loop = True
	return af


class IvrDialog(IvrDialogBase):
	welcome_msg   = None
	auth_ok_msg   = None
	auth_fail_msg = None
	hint_msg      = None

	state = collect
	keys = ''

	conf_to = ''
	conf_uri = ''
	conf_duration = 0

	def sessionInfo(self):
		print("IVR Session info:")
		print(" user:        ", self.dialog.user)
		print(" domain:      ", self.dialog.domain)
		print(" sip_ip:      ", self.dialog.sip_ip)
		print(" sip_port:    ", self.dialog.sip_port)
		print(" local_uri:   ", self.dialog.local_uri)
		print(" remote_uri:  ", self.dialog.remote_uri)
		print(" contact_uri: ", self.dialog.contact_uri)
		print(" callid:      ", self.dialog.callid)
		print(" remote_tag:  ", self.dialog.remote_tag)
		print(" local_tag:   ", self.dialog.local_tag)
		print(" remote_party:", self.dialog.remote_party)
		print(" local_party: ", self.dialog.local_party)
		print(" route:       ", self.dialog.route)
		print(" next_hop:     ", self.dialog.next_hop)
		print(" cseq:        ", self.dialog.cseq)

	def onSessionStart(self):
		self.sessionInfo()
		self.setNoRelayonly()
		self.welcome_msg = IvrAudioFile.tts("Welcome to the conferencing server. " +
						"Please enter your PIN number, followed by the star key.")
		self.auth_ok_msg = IvrAudioFile.tts("Your PIN number is correct, you will be connected now.")
#		self.auth_fail_msg = IvrAudioFile.tts("Sorry, you have entered an invalid PIN number. " + \
#							"Please try again.")
		self.hint_msg = IvrAudioFile.tts("Please enter your PIN number, followed by the star key.")

		self.enqueue(self.welcome_msg,None)

	def onBye(self):
		self.stopSession()

	def onDtmf(self,key,duration):
		if self.state == collect:
			self.flush()
			if key == 10:

				c = xmlrpclib.ServerProxy(server_path )
				erg = c.AuthorizeConference(self.dialog.remote_uri,
									self.dialog.local_party, self.keys)

				debug('result of authentication: '+ str(erg))
				if erg[0] == 'OK':
					self.flush()
					self.enqueue(self.auth_ok_msg, None)
					self.conf_to = erg[1]
					self.conf_uri = erg[2]
					self.conf_duration = erg[3]
					self.state = connect
					self.removeTimer(HINT_TIMER)
				else:
					self.keys = ''
					self.auth_fail_msg = IvrAudioFile()
					self.auth_fail_msg.open(erg[1], ivr.AUDIO_READ)
					#self.flush()
					self.enqueue(self.auth_fail_msg, None)

					self.setTimer(HINT_TIMER,  HINT_TIMEOUT)
			else:
				self.keys += str(key)
				debug("added key, PIN = " + self.keys)
				self.setTimer(HINT_TIMER,  HINT_TIMEOUT)

	def onEmptyQueue(self):
		if self.state == connect:
			debug("connecting to " + self.conf_to + "uri: " + self.conf_uri)
			self.disconnectMedia()
			self.mute()
			self.connectCallee(self.conf_to, self.conf_uri)
			self.state = connected
			if (self.conf_duration > 0):
				self.setTimer(CONF_TIMER, self.conf_duration)

		elif self.state == collect:
			self.setTimer(HINT_TIMER,  HINT_TIMEOUT)

	def onTimer(self, id):
		if id == HINT_TIMER and self.state == collect:
			self.enqueue(self.hint_msg, None)
		elif id == CONF_TIMER and self.state == connected:
			debug("conference timer timeout. disconnecting " + self.conf_to + " uri: " + self.conf_uri)
			self.terminateOtherLeg()
			self.bye()
			self.stopSession()
