/*****************************************************************************\
**                                                                           **
** PBX4Linux                                                                 **
**                                                                           **
**---------------------------------------------------------------------------**
** Copyright: Andreas Eversberg                                              **
**                                                                           **
** elektronische fernmelder identifikation                                   **
**                                                                           **
\*****************************************************************************/ 

#include "main.h"

enum {
	EFI_STATE_HELLO,
	EFI_STATE_DIE,
	EFI_STATE_BENUTZERDEFINIERTE,
	EFI_STATE_UNTERDRUECKTE,
	EFI_STATE_RUFNUMMER_LAUTET,
	EFI_STATE_DIGIT,
	EFI_STATE_ICH_WIEDERHOLE,
	EFI_STATE_STOP,
};

void EndpointAppPBX::action_init_efi(void)
{
//	int			language = e_ext.vbox_language;
//	struct route_param	*rparam;
	struct lcr_msg		*message;
	struct port_list	*portlist = ea_endpoint->ep_portlist;

	/* if no caller id */
	if (e_callerinfo.id[0] == '\0')
	{
		/* facility rejected */
		message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_DISCONNECT);
		message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
		message->param.disconnectinfo.cause = CAUSE_FACILITYREJECTED;
		message_put(message);
		logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT);
		new_state(EPOINT_STATE_OUT_DISCONNECT);
		set_tone(portlist,"cause_22");
		return;
	}

	/* connect */
	new_state(EPOINT_STATE_CONNECT);

	/* initialize the vbox */
	PDEBUG(DEBUG_EPOINT, "EPOINT(%d) initializing efi\n", ea_endpoint->ep_serial);

	e_efi_state = EFI_STATE_HELLO;
	set_tone_efi("hello");

	e_efi_digit = 0;
}

/*
 * the audio file has ended
 * this is called by Endpoint::message_port(), whenever an audio of has been received
 */
void EndpointAppPBX::efi_message_eof(void)
{
//	char buffer[32];
	char digit[] = "number_00";
//	struct lcr_msg		*message;
//	struct port_list	*portlist = ea_endpoint->ep_portlist;

	PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s end of file during state: %d\n", ea_endpoint->ep_serial, e_ext.number, e_vbox_state);

	switch(e_efi_state)
	{
		case EFI_STATE_HELLO:
		e_efi_state = EFI_STATE_DIE;
		set_tone_efi("die");
		break;
		case EFI_STATE_DIE:
		if (e_callerinfo.screen==INFO_SCREEN_USER)
		{
			e_efi_state = EFI_STATE_BENUTZERDEFINIERTE;
			set_tone_efi("benutzerdefinierte");
			break;
		}
		// fall through
		case EFI_STATE_BENUTZERDEFINIERTE:
		if (e_callerinfo.present==INFO_PRESENT_RESTRICTED)
		{
			e_efi_state = EFI_STATE_UNTERDRUECKTE;
			set_tone_efi("unterdrueckte");
			break;
		}
		// fall through
		case EFI_STATE_UNTERDRUECKTE:
		e_efi_state = EFI_STATE_RUFNUMMER_LAUTET;
		set_tone_efi("rufnummer_lautet");
		break;

		case EFI_STATE_RUFNUMMER_LAUTET:
		e_efi_state = EFI_STATE_DIGIT;
		e_efi_digit = 0;
		// fall through
		case EFI_STATE_DIGIT:
		digit[8] = numberrize_callerinfo(e_callerinfo.id,e_callerinfo.ntype, options.national, options.international)[e_efi_digit];
		if (digit[8])
		{
			set_tone_efi(digit);
			e_efi_digit++;
		} else
		{
//			e_efi_state = EFI_STATE_STOP;
			e_efi_state = EFI_STATE_ICH_WIEDERHOLE;
//			message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_DISCONNECT);
//			message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
//			message->param.disconnectinfo.cause = CAUSE_NORMAL;
//			message_put(message);
//			logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT);
//			new_state(EPOINT_STATE_OUT_DISCONNECT);
//			set_tone(portlist,"cause_10");
			set_tone_efi("ich_wiederhole");
		}
		break;

		case EFI_STATE_ICH_WIEDERHOLE:
		e_efi_state = EFI_STATE_DIE;
		set_tone_efi("die");
		break;

		case EFI_STATE_STOP:
		break;

		default:
		PERROR("efi_message_eof(ep%d): terminal %s unknown state: %d\n", ea_endpoint->ep_serial, e_ext.number, e_vbox_state);
	}
}



/*
 * set the given vbox-tone with full path (without appending)
 * the tone is played and after eof, a message is received
 */
void EndpointAppPBX::set_tone_efi(const char *tone)
{
	struct lcr_msg *message;

	if (tone == NULL)
		tone = "";

	if (!ea_endpoint->ep_portlist)
	{
		PERROR("EPOINT(%d) no portlist\n", ea_endpoint->ep_serial);
	}
	message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_VBOX_TONE);
	SCPY(message->param.tone.dir, (char *)"tones_efi");
	SCPY(message->param.tone.name, tone);
	message_put(message);

	PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s set tone '%s'\n", ea_endpoint->ep_serial, e_ext.number, tone);
}

