///////////////////////////////////////////////////////////////////////////////
// Helpdesk Queue

context hd-queue {
	s => {
		NoOp(Add a background sound to tell the user their options);
		Queue(helpdesk|t);
		NoOp(Put in options to apologize and send user to voicemail);
	};

	0 => goto default|0|1;
	1 => {
		Dial(u41950@svm1.shsu.edu);
		Congestion(10);
		Hangup;
	};
};


context l903-calling {
	_9903NXXXXXX => {
		Realtime(l903_ext|exchange|${EXTEN:4:3}|l903_);
		if ("${l903_exchange}foo" = "foo") {
			Playback(num-outside-area);
			SayDigits(1);
			Playback(and-area-code);
			Playback(before-the-number);
			Hangup;
		};
		&dialout(${EXTEN});
		Congestion(10);
		Hangup;
	};
};
///////////////////////////////////////////////////////////////////////////////
// Extensions pulled from houston.conf
// Converted the extension list to the database

context houston-calling {
	_9713NXXXXXX => {
		Realtime(hou_713_ext|exchange|${EXTEN:4:3}|hou_713_);
		if ("${hou_713_exchange}foo" = "foo") {
			Playback(num-outside-area);
			SayDigits(1);
			Playback(and-area-code);
			Playback(before-the-number);
			Hangup;
		};
		&dialout(${EXTEN});
		Congestion(10);
		Hangup;
	};

	_9281NXXXXXX => {
		Realtime(hou_281_ext|exchange|${EXTEN:4:3}|hou_281_);
		if ("${hou_281_exchange}foo" = "foo") {
			Playback(num-outside-area);
			SayDigits(1);
			Playback(and-area-code);
			Playback(before-the-number);
			Hangup;
		};
		&dialout(${EXTEN});
		Congestion(10);
		Hangup;
	};

	_9832NXXXXXX => {
		Realtime(hou_832_ext|exchange|${EXTEN:4:3}|hou_832_);
		if ("${hou_832_exchange}foo" = "foo") {
			Playback(num-outside-area);
			SayDigits(1);
			Playback(and-area-code);
			Playback(before-the-number);
			Hangup;
		};
		&dialout(${EXTEN});
		Congestion(10);
		Hangup;
	};
};


///////////////////////////////////////////////////////////////////////////////
// Extensions pulled from huntsville.conf
// Converted the extension list to the database

context huntsville-calling {
	_9NXXXXXX => {
		Realtime(hv_ext|exchange|${EXTEN:1:3}|hv_);
		if ("${hv_exchange}foo" = "foo") {
			Playback(num-outside-area);
			SayDigits(1);
			Playback(and-area-code);
			Playback(before-the-number);
			Hangup;
		};
		&dialout(${EXTEN});
		Congestion(10);
		Hangup;
	};

	_NXXXXXX => {
		NoOp(Stripping last four to see what extension we're dialing);
		Set(LAST4=${EXTEN:3});
		StripLSD(4);
	};

	i => Playback(pbx-invalid);
	h => Hangup;
};

///////////////////////////////////////////////////////////////////////////////
// Extensions pulled from macros.conf

macro dialout( number ) {
	Realtime(call_info|exten|${CALLERIDNUM:5}|mon_);
	if ("${mon_monitor}" = "YES") {
		Dial(SIP/${number}@sgw1.shsu.edu,,wW);
		Dial(SIP/${number}@sgw2.shsu.edu,,wW);
	} else {
		Dial(SIP/${number}@sgw1.shsu.edu);
		Dial(SIP/${number}@sgw2.shsu.edu);
	};
};

// Standard extension macro:
//  ${ext} - Extension
macro stdexten( ext ) {
	Realtime(sipusers|name|${ext}|sip_user_);
	Realtime(call_info|exten|${ext}|info_);
	if ("${sip_user_name}foo" = "foo") {
		Wait(1);
		&dialout(${ext});
		Congestion(10);
		Hangup;
	};
	NoOp(${CALLERIDNUM});
	RealtimeUpdate(call_info|exten|${ext}|calltrace|${CALLERIDNUM});
	System(/usr/local/bin/db_update.sh call_info calltrace ${CALLERIDNUM} exten ${ext} &);
	&checkdnd(${ext});
	&checkcf(${ext});
	Realtime(call_info|exten|${CALLERIDNUM:5}|mon_);
	if ("${mon_monitor}" = "YES") {
		Dial(SIP/${info_forwardto},25,wW);
	} else {
		Dial(SIP/${info_forwardto},25);
	};
	switch ("${DIALSTATUS}") {
		case "BUSY":
			&checkcfb(${ext});
			break;
		case "CHANUNAVAIL":
			Dial(IAX2/asterisk:password@scm2.shsu.edu/${info_forwardto},25,wW);
			MailboxExists(${ext});
//			if ("${VMBOXEXISTSSTATUS}" = "FAILED") {
//				Congestion(10);
//				Hangup;
//			};
			&uvm(${ext});
			Hangup;
			break;
		case "CONGESTION":
			MailboxExists(${ext});
			if ("$(VMBOXEXISTSSTATUS}" = "FAILED") {
				Congestion(10);
				Hangup;
			};
			&bvm(${ext});
			Hangup;
			break;
		default:
			MailboxExists(${ext});
			if ("$(VMBOXEXISTSSTATUS}" = "FAILED") {
				Congestion(10);
				Hangup;
			};
			&uvm(${ext});
			Hangup;
	};
	Hangup;
};

macro uvm( ext ) {
	Dial(SIP/u${ext}@svm1.shsu.edu);
	Playback(im-sorry);
	Playback(voice-mail-system);
	Playback(down);
	Congestion(10);
	Hangup;
};

macro bvm( ext ) {
	Dial(SIP/b${ext}@svm1.shsu.edu);
	Playback(im-sorry);
	Playback(voice-mail-system);
	Playback(down);
	Congestion(10);
	Hangup;
};

macro checkdnd( ext ) {
	if ("${info_donotdisturb}foo" = "foo") {
		NoOp(Do Not Disturb is not active);
	} else
		&uvm(${ext});
};

macro checkcf( ext ) {
	if ("${info_forwardto}foo" = "foo")
		if ("${ext}" = "43974") {
			Set(info_forwardto=${ext}&SCCP/${ext});
		} else {
			Set(info_forwardto=${ext}&SIP/${ext}w);
		};
};

macro checkcfb( ext ) {
	if ("${info_forwardbusy}foo" = "foo") {
		Wait(1);
		MailboxExists(${ext});
		if ("$(VMBOXEXISTSSTATUS}" = "FAILED") {
			&dialout(${ext});
			Hangup;
		};
		&bvm(${ext});
		Hangup;
	};
	&stdexten(${info_forwardbusy});
};

///////////////////////////////////////////////////////////////////////////////
// Extensions pulled from test.conf

context test-include {
	includes {
		test-digium;
		test-sounds;
		test-phinfo;
	};
};

context test-digium {
	*500 => {
		Dial(IAX2/guest@misery.digium.com/s@default);
		Playback(demo-nogo);
		Hangup;
	};
};

context test-sounds {
	*501 => {
		Answer;
		Musiconhold;
		Wait(1);
		Hangup;
	};
};

context test-phinfo {
	*505 => {
		Answer;
		NoOp(${CALLERIDNUM:5});
		SayDigits(${CALLERIDNUM:5});
		Hangup;
	};
};

///////////////////////////////////////////////////////////////////////////////
// Extensions pulled from external.conf

context long-distance {
	includes {
		local1;
	};

	_91XXXXXXXXXX => &dialout(${EXTEN});
	_9011. => &dialout(${EXTEN});
};

context local1 {
	includes {
		default;
	};

	911 => &dialout(911);
	9911 => &dialout(9911);

	_9NXXXXXX => goto huntsville-calling|${EXTEN}|1;
	_936NXXXXXX => {
		Goto 9${EXTEN:3}|1;
		Congestion(10);
		Hangup;
	};

	_832NXXXXXX => {
		goto 9${EXTEN}|1;
		Congestion(10);
		Hangup;
	};

	_713NXXXXXX => {
		goto 9${EXTEN}|1 ;
		Congestion(10);
		Hangup;
	};

	_281NXXXXXX => {
		goto 9${EXTEN}|1;
		Congestion(10);
		Hangup;

	};

	_NXXNXXXXXX => {
		goto 9${EXTEN}|1;
		goto 91${EXTEN}|1;
		Congestion(10);
		Hangup;
	};

	_91800NXXXXXX => &dialout(${EXTEN});
	_91866NXXXXXX => &dialout(${EXTEN});
	_91877NXXXXXX => &dialout(${EXTEN});
	_91888NXXXXXX => &dialout(${EXTEN});
	_91900NXXXXXX => &dialout(${EXTEN});
	_91976NXXXXXX => &dialout(${EXTEN});
	_9713NXXXXXX => goto houston-calling|${EXTEN}|1;
	_9281NXXXXXX => goto houston-calling|${EXTEN}|1;
	_9832NXXXXXX => goto houston-calling|${EXTEN}|1;
	_9903NXXXXXX => goto l903-calling|${EXTEN}|1;

	_31NXXNXXXXXX => &dialout(${EXTEN});

	h => Hangup;
};

///////////////////////////////////////////////////////////////////////////////
// Extensions pulled from internal.conf

context from-scm2 {
	_4XXXX => {
		NoOp(DIALING SIP EXTENSION ${EXTEN} - FROM ${CALLERIDNUM});
		Dial(SIP/${EXTEN},20,wW);
		Hangup;
	};

	_6XXXX => {
		NoOp(DIALING SIP EXTENSION ${EXTEN} - FROM ${CALLERIDNUM});
		Dial(SIP/${EXTEN},20,wW);
		Hangup;
	};
};

///////////////////////////////////////////////////////////
// All internal extensions work through the default context
// Phones that can only make internal calls should be in
// this context.
///////////////////////////////////////////////////////////

context default {
// Include the contexts in the files that allow us to make these phone calls
	includes {
		vm-include;
		apps-include;
		test-include;
	};

// ALWAYS have an 'h' extension
	h => {
		NoOp(Hangup cause was: ${HANGUPCAUSE});
		Hangup;
	};

// We like to hear that we dialed an invalid extension
	i => Playback(pbx-invalid);

// Dial the operator
	0 => &dialout(0);

// Send voicemail calls to the vm-* contexts to be handled
	voicemail => goto vm-direct|s|1;
	5555 => goto vm-direct|s|1;
	62100 => goto vm-extension|s|1;

// These are our campus extensions, send them to the macro
	_6XXXX => &stdexten(${EXTEN});
	_4XXXX => &stdexten(${EXTEN});
// These are campus extensions as well, might need to take this out though.
	_9294XXXX => goto _4XXXX|1;
	_9496XXXX => goto _6XXXX|1;

// These allows us to dial from the directory in our phone without worrying about dialing 9
	_936294XXXX => {
		goto ${EXTEN:5}|1;
		goto 9${EXTEN:3}|1;
		Congestion(10);
		Hangup;
	};

	_936496XXXX => {
		goto ${EXTEN:5}|1;
		goto 9${EXTEN:3}|1;
		Congestion(10);
		Hangup;
	};
};

///////////////////////////////////////////////////////////////////////////////
// Extensions pulled from apps.conf

context apps-include {
	includes {
		app-agents;
		app-dnd;
		app-callforward;
		app-calltrace;
		app-conferences;
		app-ssd;
		app-psd;
		app-idblock;
		app-helpdesk;
		app-dictate;
		app-set-monitor;
	};
};

context app-agents {
	*54 => {
		Answer;
		Wait(1);
		Read(agent_no|agent-user);
		AgentCallbackLogin(${agent_no}|s${CALLERIDNUM:5});
		Playback(agent-loginok);
		Hangup;
	};

	*55 => {
		Answer;
		Wait(1);
		AgentCallbackLogin(${agent_no});
		Hangup;
	};
};

context app-calltrace {
// caller dials this to find out the last call missed and possibly call back
	*69 => goto app-calltrace-perform|s|1;
};

context app-calltrace-perform {
	s => {
		Answer;
		Wait(1);
		Background(info-about-last-call);
		Background(telephone-number);
		RealTime(call_info|exten|${CALLERIDNUM:5}|ct_);
		if ("${ct_calltrace}foo" = "foo") {
			Playback(loligo/from-unknown-caller);
			Hangup;
		} else {
			SayDigits("${ct_calltrace}");
			Set(TIMEOUT(digit)=3);
			Set(TIMEOUT(response)=7);
			Background(loligo/to-call-this-number);
			Background(press-1);
			Background(loligo/silence/5);
		};
	};

	1 => goto local1|${ct_calltrace}|1;

	i => {
		Playback(vm-goodbye);
		Hangup;
	};

	t => {
		Playback(vm-goodbye);
		Hangup;
	};
};

context app-set-monitor {
	*50 => {
		Realtime(call_info|exten|${CALLERIDNUM:5}|mon_set_);
		if ("${mon_set_monitor}" = "YES") {
			RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|monitor|);
			System(/usr/local/bin/db_update.sh call_info monitor '' exten ${CALLERIDNUM:5} &);
		} else {
			RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|monitor|YES);
			System(/usr/local/bin/db_update.sh call_info monitor YES exten ${CALLERIDNUM:5} &);
		};
		NoOp(${mon_set_monitor});
		Hangup;
	};
};

context app-dnd {
	*78 => {
		Answer;
		Wait(1);
		RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|donotdisturb|YES);
		System(/usr/local/bin/db_update.sh call_info donotdisturb YES exten ${CALLERIDNUM:5} &);
		Playback(do-not-disturb);
		Playback(loligo/activated);
		Hangup;
	};

	*79 => {
		Answer;
		Wait(1);
		RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|donotdisturb|);
		System(/usr/local/bin/db_update.sh call_info donotdisturb '' exten ${CALLERIDNUM:5} &);
		Playback(do-not-disturb);
		Playback(loligo/de-activated);
		Hangup;
	};
};

context app-callforward {
	// forwards calling extension to input number *72{EXTEN}
	_*72. => {
		RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|forwardto|${EXTEN:3});
		System(/usr/local/bin/db_update.sh call_info forwardto ${EXTEN:3} exten ${CALLERIDNUM:5} &);
		Answer;
		Wait(1);
		Playback(loligo/call-fwd-unconditional);
		Playback(loligo/for);
		Playback(loligo/extension);
		SayDigits(${CALLERIDNUM:5});
		Playback(loligo/is-set-to);
		SayDigits(${EXTEN:3});
		Hangup;
	};

	// prompts for extension to forward to
	*72 => {
		Answer;
		Wait(1);
		Playback(please-enter-your);
		Playback(extension);
		Background(then-press-pound);
		VMAuthenticate(|s);
		Background(loligo/ent-target-attendant);
		Read(toext,loligo/then-press-pound);
		Wait(1);
		RealtimeUpdate(call_info|exten|${AUTH_MAILBOX}|forwardto|${toext});
		System(/usr/local/bin/db_update.sh call_info forwardto ${toext} exten ${AUTH_MAILBOX} &);
		Playback(loligo/call-fwd-unconditional);
		Playback(loligo/for);
		Playback(loligo/extension);
		SayDigits(${AUTH_MAILBOX});
		Playback(loligo/is-set-to);
		SayDigits(${toext});
		Hangup;
	};

	// cancels dialed extension call forward
	_*73. => {
		Realtime(voicemail|mailbox|${EXTEN:3}|auth_);
		Answer;
		Wait(1);
		Authenticate(${auth_password});
		RealtimeUpdate(call_info|exten|${EXTEN:3}|forwardto|);
		System(/usr/local/bin/db_update.sh call_info forwardto '' exten ${EXTEN:3} &);
		Wait(1);
		SayDigits(${EXTEN:3});
		Playback(loligo/call-fwd-cancelled);
		Hangup;
	};

	// cancels call forward for calling extension
	*73 => {
		RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|forwardto|);
		System(/usr/local/bin/db_update.sh call_info forwardto '' exten ${CALLERIDNUM:5} &);
		Answer;
		Wait(1);
		Playback(loligo/call-fwd-cancelled);
		Hangup;
	};

	// dialed call forward on busy
	_*90. => {
		RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|forwardbusy|${EXTEN:3});
		System(/usr/local/bin/db_update.sh call_info forwardbusy ${EXTEN:3} exten ${CALLERIDNUM:5} &);
		Answer;
		Wait(1);
		Playback(loligo/call-fwd-on-busy);
		Playback(loligo/for);
		Playback(loligo/extension);
		SayDigits(${CALLERIDNUM:5});
		Playback(loligo/is-set-to);
		SayDigits(${EXTEN:3});
		Hangup;
	};

	// cancels call forward on busy for calling extension
	*91 => {
		RealtimeUpdate(call_info|exten|${CALLERIDNUM:5}|forwardbusy|);
		System(/usr/local/bin/db_update.sh call_info forwardbusy '' exten ${CALLERIDNUM:5} &);
		Answer;
		Wait(1);
		Playback(loligo/call-fwd-on-busy);
		Playback(loligo/de-activated);
		Hangup;
	};

	h => Hangup;
};

context app-idblock {
	_*67. => {
		Set(CALLERID(name)=Anonymous);
		&stdexten(${EXTEN:3});
	};
};

context app-dictate {
	*1 => {
		Dictate();
		Hangup;
	};
};

context app-ssd {
// *59 <xx> <y.> - Set system speed dial <xx> to digits <y.>
// *59 <xx> 0    - Delete system speed dial <xx>
// *59 <xx>      - Review system speed dial <xx>
// *1xx          - Dial speed dial <xx>
	_*59XXX. => {
		Answer;
		RealtimeUpdate(ssd|sd|${EXTEN:3:2}|extension|${EXTEN:5});
		System(/usr/local/bin/db_update.sh systemsd extension ${EXTEN:5} sd ${EXTEN:3:2} &);
		Wait(1);
		Playback(loligo/speed-dial);
		SayDigits(${EXTEN:3:2});
		Playback(loligo/has-been-set-to);
		SayDigits(${EXTEN:5});
		Hangup;
	};

	_*59XX0 => {
		Answer;
		RealtimeUpdate(ssd|sd|${EXTEN:3:2}|extension|);
		System(/usr/local/bin/db_update.sh systemsd extension '' sd ${EXTEN:3:2} &);
		Wait(1);
		Playback(loligo/speed-dial);
		SayDigits(${EXTEN:3:2});
		Playback(loligo/has-been-cleared);
		Hangup;
	};

	_*59XX => {
		Answer;
		Realtime(ssd|sd|${EXTEN:3}|ssd_);
		if ("${ssd_extension}foo" = "foo") {
			Playback(loligo/speed-dial);
			SayDigits(${EXTEN:3:2});
			Playback(loligo/is-not-set);
			Hangup;
		};
		Wait(1);
		Playback(loligo/speed-dial);
		SayDigits(${EXTEN:3:2});
		Playback(loligo/is-set-to);
		SayDigits(${ssd_extension});
		Hangup;
	};

	// NTC = number to call
	_*1XX => {
		Realtime(ssd|sd|${EXTEN:2}|ssd_);
		if ("${ssd_extension}foo" = "foo") {
			Answer;
			Wait(1);
			Playback(loligo/speed-dial);
			SayDigits(${EXTEN:2});
			Playback(loligo/is-not-set);
			Hangup;
		};
		&stdexten(${ssd_extension});
		Congestion(10);
		Hangup;
	};
};

macro check-psd-exists ( ext ) {
	Realtime(psd|extension|${ext}|psd_);
	if ("${psd_extension}foo" = "foo") {
		System(/usr/local/bin/create_psd.sh ${ext});
	} else
		NoOp(PSD set for ${ext});
};

context app-psd {
// *89 <xx> <y.> - Set personal speed dial <xx> to digits <y.>
// *89 <xx> 0    - Delete personal speed dial <xx>
// *89 <xx>      - Review personal speed dial <xx>
// *2xx          - Dial personal speed dial <xx>
	_*89XXX. => {
		&check-psd-exists(${CALLERIDNUM:5});
		Answer;
		RealtimeUpdate(psd|extension|${CALLERIDNUM:5}|s${EXTEN:3:2}|${EXTEN:5});
		System(/usr/local/bin/db_update.sh personalsd s${EXTEN:3:2} ${EXTEN:5} extension ${CALLERIDNUM:5} &);
		Wait(1);
		Playback(loligo/speed-dial);
		SayDigits(${EXTEN:3:2});
		Playback(loligo/has-been-set-to);
		SayDigits(${EXTEN:5});
		Hangup;
	};

	_*89XX0 => {
		&check-psd-exists(${CALLERIDNUM:5});
		Answer;
		RealtimeUpdate(psd|extension|${CALLERIDNUM:5}|s${EXTEN:3:2}|);
		System(/usr/local/bin/db_update.sh personalsd s${EXTEN:3:2} '' extension ${CALLERIDNUM:5} &);
		Wait(1);
		Playback(loligo/speed-dial);
		SayDigits(${EXTEN:3:2});
		Playback(loligo/has-been-cleared);
		Hangup;
	};

	_*89XX => {
		&check-psd-exists(${CALLERIDNUM:5});
		Answer;
		Realtime(psd|extension|${CALLERIDNUM:5}|psd_);
		Wait(1);
		if ("${psd_s${EXTEN:3:2}}foo" = "foo") {
			Playback(loligo/speed-dial);
			SayDigits(${EXTEN:3:2});
			Playback(loligo/is-not-set);
			Hangup;
		};
		Playback(loligo/speed-dial);
		SayDigits(${EXTEN:3:2});
		Playback(loligo/is-set-to);
		SayDigits(${psd_s${EXTEN:3:2}});
		Hangup;
	};

	// NTC = number to call
	_*2XX => {
		&check-psd-exists(${CALLERIDNUM:5});
		Realtime(psd|extension|${CALLERIDNUM:5}|psd_);
		if ("${psd_s${EXTEN:2}}foo" = "foo") {
			Answer;
			Wait(1);
			Playback(loligo/speed-dial);
			SayDigits(${EXTEN:2});
			Playback(loligo/is-not-set);
			Hangup;
		};
		&stdexten(${psd_s${EXTEN:2}});
		Congestion(10);
		Hangup;
	};
};

context app-helpdesk {
	*4357 => {
		&stdexten(41950);
		Congestion;
	};
};

context app-conferences {
// waiting for room number announcement
	*86 => goto app-conf-hidden|s|1;
};

context app-conf-hidden {
	s => {
		Wait(1);
		Playback(loligo/please-enter-the);
		Playback(loligo/extension);
		read(roomtoenter,loligo/then-press-pound);
		Meetme(${roomtoenter});
		Waitexten(8);
		Hangup;
	};

	_1. => Meetme(${EXTEN});
};

///////////////////////////////////////////////////////////////////////////////
// Extensions pulled from vm.conf:

context vm-include {
	includes {
		vm-direct;
		vm-extension;
		vm-directory;
	};
};

context vm-direct {
	s => {
		Dial(SIP/5555@svm1.shsu.edu,20);
		Playback(im-sorry);
		Playback(voice-mail-system);
		Playback(down);
		Playback(extra/pls-try-call-later);
		Congestion(10);
		Hangup;
	};
};

context vm-extension {
	s => {
		Dial(SIP/62100@svm1.shsu.edu,20);
		Playback(im-sorry);
		Playback(voice-mail-system);
		Playback(down);
		Playback(extra/pls-try-call-later);
		Congestion(10);
		Hangup;
	};
};

context vm-directory {
	5556 => {
		Dial(SIP/5556@svm1.shsu.edu);
		Playback(im-sorry);
		Playback(voice-mail-system);
		Playback(down);
		Playback(extra/pls-try-call-later);
		Congestion(10);
		Hangup;
	};
};
