module USSD_Helpers {

/* USSD helpers for composing messages, building on top
 * of both L3_Templates and USSD_Templates.
 *
 * (C) 2018 by Vadim Yanitskiy <axilirator@gmail.com>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

import from General_Types all;
import from TCCEncoding_Functions all;

import from SS_Templates all;
import from SS_Types all;

function f_USSD_FACILITY_IE_INVOKE(
	integer invoke_id := 1,
	SS_Op_Code op_code := SS_OP_CODE_PROCESS_USS_REQ,
	charstring ussd_string := "*#100#"
) return octetstring {
	var SS_FacilityInformation facility_ie;
	var octetstring ussd_string_enc;

	/* Encode input string with GSM 7-bit encoding */
	ussd_string_enc := f_encGSM7bit(ussd_string);

	/* Encode Facility IE */
	facility_ie := valueof(ts_SS_USSD_FACILITY_INVOKE(
		invoke_id := invoke_id,
		op_code := op_code,
		ussd_dcs := SS_USSD_DEFAULT_DCS,
		ussd_string := ussd_string_enc
	));

	return enc_SS_FacilityInformation(facility_ie);
}

function f_USSD_FACILITY_IE_RETURN_RESULT(
	integer invoke_id := 1,
	SS_Op_Code op_code := SS_OP_CODE_PROCESS_USS_REQ,
	charstring ussd_string := "Lorem Ipsum"
) return octetstring {
	var SS_FacilityInformation facility_ie;
	var octetstring ussd_string_enc;

	/* Encode input string with GSM 7-bit encoding */
	ussd_string_enc := f_encGSM7bit(ussd_string);

	/* Encode Facility IE */
	facility_ie := valueof(ts_SS_USSD_FACILITY_RETURN_RESULT(
		invoke_id := invoke_id,
		op_code := op_code,
		ussd_dcs := SS_USSD_DEFAULT_DCS,
		ussd_string := ussd_string_enc
	));

	return enc_SS_FacilityInformation(facility_ie);
}

function f_USSD_FACILITY_IE_RETURN_ERROR(
	integer invoke_id := 1,
	SS_Err_Code err_code := SS_ERR_CODE_UNEXPECTED_DATA_VALUE
) return octetstring {
	var SS_FacilityInformation facility_ie;

	/* Encode Facility IE */
	facility_ie := valueof(ts_SS_FACILITY_RETURN_ERROR(
		invoke_id := invoke_id,
		err_code := err_code
	));

	return enc_SS_FacilityInformation(facility_ie);
}

}
