module SS_Templates {

/* SS/USSD Facility IE templates, building on top of SS_Types.
 *
 * (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 SS_Types all;

/* GSM TS 04.80, section 4.5, SS operation code */
type enumerated SS_Op_Code {
	SS_OP_CODE_REGISTER_SS			('0A'O),
	SS_OP_CODE_ERASE_SS			('0B'O),
	SS_OP_CODE_ACTIVATE_SS			('0C'O),
	SS_OP_CODE_DEACTIVATE_SS		('0D'O),
	SS_OP_CODE_INTERROGATE_SS		('0E'O),
	SS_OP_CODE_NOTIFY_SS			('10'O),
	SS_OP_CODE_REGISTER_PASSWORD		('11'O),
	SS_OP_CODE_GET_PASSWORD			('12'O),
	SS_OP_CODE_PROCESS_USS_DATA		('13'O),
	SS_OP_CODE_FORWARD_CHECK_SS_IND		('26'O),
	SS_OP_CODE_PROCESS_USS_REQ		('3B'O),
	SS_OP_CODE_USS_REQUEST			('3C'O),
	SS_OP_CODE_USS_NOTIFY			('3D'O),
	SS_OP_CODE_FORWARD_CUG_INFO		('78'O),
	SS_OP_CODE_SPLIT_MPTY			('79'O),
	SS_OP_CODE_RETRIEVE_MPTY		('7A'O),
	SS_OP_CODE_HOLD_MPTY			('7B'O),
	SS_OP_CODE_BUILD_MPTY			('7C'O),
	SS_OP_CODE_FORWARD_CHARGE_ADVICE	('7D'O)
}

/* GSM TS 04.80, section 4.5, SS error code */
type enumerated SS_Err_Code {
	SS_ERR_CODE_UNKNOWN_SUBSCRIBER			('01'O),
	SS_ERR_CODE_ILLEGAL_SUBSCRIBER			('09'O),
	SS_ERR_CODE_BEARER_SERVICE_NOT_PROVISIONED	('0A'O),
	SS_ERR_CODE_TELESERVICE_NOT_PROVISIONED		('0B'O),
	SS_ERR_CODE_ILLEGAL_EQUIPMENT			('0C'O),
	SS_ERR_CODE_CALL_BARRED				('0D'O),
	SS_ERR_CODE_ILLEGAL_SS_OPERATION		('10'O),
	SS_ERR_CODE_SS_ERROR_STATUS			('11'O),
	SS_ERR_CODE_SS_NOT_AVAILABLE			('12'O),
	SS_ERR_CODE_SS_SUBSCRIPTION_VIOLATION		('13'O),
	SS_ERR_CODE_SS_INCOMPATIBILITY			('14'O),
	SS_ERR_CODE_FACILITY_NOT_SUPPORTED		('15'O),
	SS_ERR_CODE_ABSENT_SUBSCRIBER			('1B'O),
	SS_ERR_CODE_SYSTEM_FAILURE			('22'O),
	SS_ERR_CODE_DATA_MISSING			('23'O),
	SS_ERR_CODE_UNEXPECTED_DATA_VALUE		('24'O),
	SS_ERR_CODE_PW_REGISTRATION_FAILURE		('25'O),
	SS_ERR_CODE_NEGATIVE_PW_CHECK			('26'O),
	SS_ERR_CODE_NUM_PW_ATTEMPTS_VIOLATION		('2B'O),
	SS_ERR_CODE_UNKNOWN_ALPHABET			('47'O),
	SS_ERR_CODE_USSD_BUSY				('48'O),
	SS_ERR_CODE_MAX_MPTY_PARTICIPANTS		('7E'O),
	SS_ERR_CODE_RESOURCES_NOT_AVAILABLE		('7F'O)
}

/**
 * According to GSM TS 02.90, section 4.1.1,
 * the mobile initiated USSD request shall contain
 * an alphabet indicator set to "SMS default alphabet"
 * and language indicator set to "language unspecified".
 *
 * This DCS value is used quite often, so it makes
 * sense to define it here as a constant.
 */
const octetstring SS_USSD_DEFAULT_DCS := '0F'O;

template (value) SS_FacilityInformation ts_SS_USSD_FACILITY_INVOKE(
	integer invoke_id := 1,
	SS_Op_Code op_code := SS_OP_CODE_PROCESS_USS_REQ,
	octetstring ussd_dcs := SS_USSD_DEFAULT_DCS,
	octetstring ussd_string := 'AA180C3602'O // *#100#
) := {
	{
		invoke := {
			invokeId := { present_ := invoke_id },
			linkedId := omit,
			opcode := {
				local := enum2int(op_code)
			},
			argument := {
				uSSD_Arg := {
					ussd_DataCodingScheme := ussd_dcs,
					ussd_String := ussd_string,
					alertingPattern := omit,
					msisdn := omit
				}
			}
		}
	}
}
template SS_FacilityInformation tr_SS_USSD_FACILITY_INVOKE(
	template integer invoke_id := ?,
	template integer op_code := ?,
	template octetstring ussd_dcs := ?,
	template octetstring ussd_string := ?
) := {
	{
		invoke := {
			invokeId := { present_ := invoke_id },
			linkedId := omit,
			opcode := {
				local := op_code
			},
			argument := {
				uSSD_Arg := {
					ussd_DataCodingScheme := ussd_dcs,
					ussd_String := ussd_string,
					alertingPattern := omit,
					msisdn := omit
				}
			}
		}
	}
}

template (value) SS_FacilityInformation ts_SS_FACILITY_INVOKE(
	integer invoke_id := 1,
	SS_Op_Code op_code,
	OCT1 ss_code
) := {
	{
		invoke := {
			invokeId := { present_ := invoke_id },
			linkedId := omit,
			opcode := { local := enum2int(op_code) },
			argument := {
				sS_ForBS_Code := {
					ss_Code := ss_code,
					basicService := omit,
					longFTN_Supported := omit
				}
			}
		}
	}
}
template SS_FacilityInformation tr_SS_FACILITY_INVOKE(
	template integer invoke_id := 1,
	template integer op_code := ?,
	template OCT1 ss_code := ?
) := {
	{
		invoke := {
			invokeId := { present_ := invoke_id },
			linkedId := omit,
			opcode := { local := op_code },
			argument := {
				sS_ForBS_Code := {
					ss_Code := ss_code,
					basicService := omit,
					longFTN_Supported := omit
				}
			}
		}
	}
}

template (value) SS_FacilityInformation ts_SS_USSD_FACILITY_RETURN_RESULT(
	integer invoke_id := 1,
	SS_Op_Code op_code := SS_OP_CODE_PROCESS_USS_REQ,
	octetstring ussd_dcs,
	octetstring ussd_string
) := {
	{
		returnResult := {
			invokeId := { present_ := invoke_id },
			result := {
				opcode := {
					local := enum2int(op_code)
				},
				result := {
					uSSD_Res := {
						ussd_DataCodingScheme := ussd_dcs,
						ussd_String := ussd_string
					}
				}
			}
		}
	}
}
template SS_FacilityInformation tr_SS_USSD_FACILITY_RETURN_RESULT(
	template integer invoke_id := ?,
	template integer op_code := ?,
	template octetstring ussd_dcs := ?,
	template octetstring ussd_string := ?
) := {
	{
		returnResult := {
			invokeId := { present_ := invoke_id },
			result := {
				opcode := {
					local := op_code
				},
				result := {
					uSSD_Res := {
						ussd_DataCodingScheme := ussd_dcs,
						ussd_String := ussd_string
					}
				}
			}
		}
	}
}

template (value) SS_FacilityInformation ts_SS_USSD_FACILITY_RETURN_RESULT_EMPTY(
	integer invoke_id := 1
) := {
	{
		returnResult := {
			invokeId := { present_ := invoke_id },
			result := omit
		}
	}
}
template SS_FacilityInformation tr_SS_USSD_FACILITY_RETURN_RESULT_EMPTY(
	template integer invoke_id := ?
) := {
	{
		returnResult := {
			invokeId := { present_ := invoke_id },
			result := omit
		}
	}
}

/* Common for both structured and unstructured SS */
template (value) SS_FacilityInformation ts_SS_FACILITY_RETURN_ERROR(
	integer invoke_id := 1,
	SS_Err_Code err_code
) := {
	{
		returnError := {
			invokeId := { present_ := invoke_id },
			errcode := {
				local := enum2int(err_code)
			},
			parameter := omit
		}
	}
}
template SS_FacilityInformation tr_SS_FACILITY_RETURN_ERROR(
	template integer invoke_id := ?,
	template integer err_code := ?
) := {
	{
		returnError := {
			invokeId := { present_ := invoke_id },
			errcode := {
				local := err_code
			},
			parameter := omit
		}
	}
}

}