#pragma once

#include <osmocom/core/endian.h>

/* Section 9.3.24: Warning-Type */
enum gsm23041_warning_type_value {
	CBS_ETWS_WARN_TYPE_EARTHQUAKE = 0,
	CBS_ETWS_WARN_TYPE_TSUNAMI = 1,
	CBS_ETWS_WARN_TYPE_EARTHQUAKE_AND_TSUNAMI = 2,
	CBS_ETWS_WARN_TYPE_TEST = 3,
	CBS_ETWS_WARN_TYPE_OTHER = 4,
	/* 0000101-1111111 Reserved for future use */
};

/* Section 9.4.1.2: GSM Message Format */
struct gsm23041_msg_param_gsm {
	uint16_t serial_nr;
	uint16_t message_id;
	uint8_t dcs;
	struct {
#if OSMO_IS_LITTLE_ENDIAN
		uint8_t num_pages:4,
			page_nr:4;
#elif OSMO_IS_BIG_ENDIAN
/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
		uint8_t page_nr:4, num_pages:4;
#endif
	} page_param;
	uint8_t content[0];
} __attribute__ ((packed));

/* Section 9.4.1.2.2 Message Identifier */
enum {
	/* 0 - 999: Allocated by GSM AD.26 */
	CBS_MSGID_LCS_EOTD_ASSIST	= 1000,
	CBS_MSGID_LCS_DGPS_CORRECTION	= 1001,
	CBS_MSGID_LCS_GPS_EPHEM_CLOCK	= 1002,
	CBS_MSGID_LCS_GPS_ALMANAC_OTHER	= 1003,
	/* 1004 - 4095: RFU */
	/* 4096 - 4223: clear text SIM data download */
	/* 4224 - 4351: secured SIM data download */
	CBS_MSGID_ETWS_EARTHQUAKE	= 4352,
	CBS_MSGID_ETWS_TSUNAMI		= 4353,
	CBS_MSGID_ETWS_EARTHQUAKE_TSUNAMI = 4354,
	CBS_MSGID_ETWS_TEST		= 4355,
	CBS_MSGID_ETWS_OTHER		= 4356,
	/* 4357 - 4359: ETWS RFU */
	/* 4360 - 4369: RFU */
	CBS_MSGID_CMAS_PRESIDENTIAL	= 4370,
	CBS_MSGID_CMAS_EXTREME_IMMEDIATE_OBSERVED	= 4371,
	CBS_MSGID_CMAS_EXTREME_IMMEDIATE_LIKELY		= 4372,
	CBS_MSGID_CMAS_EXTREME_EXPECTED_OBSERVED	= 4373,
	CBS_MSGID_CMAS_EXTREME_EXPECTED_LIKELY		= 4374,
	CBS_MSGID_CMAS_SEVERE_IMMEDIATE_OBSERVED	= 4375,
	CBS_MSGID_CMAS_SEVERE_IMMEDIATE_LIKELY		= 4376,
	CBS_MSGID_CMAS_SEVERE_EXPECTED_OBSERVED		= 4377,
	CBS_MSGID_CMAS_SEVERE_EXPECTED_LIKELY		= 4378,
	CBS_MSGID_CMAS_AMBER				= 4379,
	CBS_MSGID_CMAS_MONTHLY_TEST			= 4380,
	CBS_MSGID_CMAS_EXERCISE				= 4381,
	CBS_MSGID_CMAS_OPERATOR_DEFINED			= 4382,
	CBS_MSGID_CMAS_PRESIDENTIAL_ADDL		= 4383,
	CBS_MSGID_CMAS_EXTREME_IMMEDIATE_OBSERVED_ADDL	= 4384,
	CBS_MSGID_CMAS_EXTREME_IMMEDIATE_LIKELY_ADDL	= 4385,
	CBS_MSGID_CMAS_EXTREME_EXPECTED_OBSERVED_ADDL	= 4386,
	CBS_MSGID_CMAS_EXTREME_EXPECTED_LIKELY_ADDL	= 4387,
	CBS_MSGID_CMAS_SEVERE_IMMEDIATE_OBSERVED_ADDL	= 4388,
	CBS_MSGID_CMAS_SEVERE_IMMEDIATE_LIKELY_ADDL	= 4389,
	CBS_MSGID_CMAS_SEVERE_EXPECTED_OBSERVED_ADDL	= 4390,
	CBS_MSGID_CMAS_SEVERE_EXPECTED_LIKELY_ADDL	= 4391,
	CBS_MSGID_CMAS_AMBER_ADDL			= 4392,
	CBS_MSGID_CMAS_MONTHLY_TEST_ADDL		= 4393,
	CBS_MSGID_CMAS_EXERCISE_ADDL			= 4394,
	CBS_MSGID_CMAS_OPERATOR_DEFINED_ADDL		= 4395,
	/* 4396 - 4399: RFU CMAS / EU-Alert */
	/* 4400 - 6399: RFU PWS */
	CBS_MSGID_EU_INFO_LOCAL_LANG			= 6400,
	/* 6491 - 40959: RFU */
	/* 40960 - 45055: PLMN operator specific range */
	/* 45056 - 61439: PLMN operator specific range RFU */
	/* 61440 - 65534: PLMN operator specific range */
	CBS_MSGID_RESERVED				= 65535
};

/* Section 9.4.1.3.2 ETWS Primary Notification Message Parameter */
struct gsm23041_etws_primary_gsm {
	uint16_t serial_nr;
	uint16_t message_id;
	uint16_t warning_type;
	uint8_t warning_sec_info[50];
} __attribute__ ((packed));


/* Section 9.4.2.2 UMTS Message Parameter */
struct gsm23041_msg_param_umts {
	uint8_t msg_type;	/* as per TS 25.324 */
	uint16_t message_id;
	uint16_t serial_nr;
	uint8_t dcs;
	uint8_t content[0];
} __attribute__ ((packed));
