/* coding_scheme.c
 *
 * Copyright (C) 2019 by sysmocom s.f.m.c. GmbH
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#include <stdint.h>
#include <stdbool.h>

#include <osmocom/core/utils.h>

#include "coding_scheme.h"

const struct value_string mcs_names[] = {
	{ UNKNOWN, "UNKNOWN" },
	{ CS1, "CS-1" },
	{ CS2, "CS-2" },
	{ CS3, "CS-3" },
	{ CS4, "CS-4" },
	{ MCS1, "MCS-1" },
	{ MCS2, "MCS-2" },
	{ MCS3, "MCS-3" },
	{ MCS4, "MCS-4" },
	{ MCS5, "MCS-5" },
	{ MCS6, "MCS-6" },
	{ MCS7, "MCS-7" },
	{ MCS8, "MCS-8" },
	{ MCS9, "MCS-9" },
	{ 0, NULL }
};

enum Family {
	FAMILY_INVALID,
	FAMILY_A,
	FAMILY_B,
	FAMILY_C,
};

static struct {
	struct {
		uint8_t bytes;
		uint8_t ext_bits;
		uint8_t data_header_bits;
	} uplink, downlink;
	uint8_t data_bytes;
	uint8_t optional_padding_bits;
	enum HeaderType data_hdr;
	enum Family family;
} mcs_info[NUM_SCHEMES] = {
	{{0, 0},   {0, 0},    0,  0,
		HEADER_INVALID, FAMILY_INVALID},
	{{23, 0},  {23, 0},  20,  0,
		HEADER_GPRS_DATA, FAMILY_INVALID},
	{{33, 7},  {33, 7},  30,  0,
		HEADER_GPRS_DATA, FAMILY_INVALID},
	{{39, 3},  {39, 3},  36,  0,
		HEADER_GPRS_DATA, FAMILY_INVALID},
	{{53, 7},  {53, 7},  50,  0,
		HEADER_GPRS_DATA, FAMILY_INVALID},

	{{26, 1},  {26, 1},  22,  0,
		HEADER_EGPRS_DATA_TYPE_3, FAMILY_C},
	{{32, 1},  {32, 1},  28,  0,
		HEADER_EGPRS_DATA_TYPE_3, FAMILY_B},
	{{41, 1},  {41, 1},  37, 48,
		HEADER_EGPRS_DATA_TYPE_3, FAMILY_A},
	{{48, 1},  {48, 1},  44,  0,
		HEADER_EGPRS_DATA_TYPE_3, FAMILY_C},

	{{60, 7},  {59, 6},  56,  0,
		HEADER_EGPRS_DATA_TYPE_2, FAMILY_B},
	{{78, 7},  {77, 6},  74, 48,
		HEADER_EGPRS_DATA_TYPE_2, FAMILY_A},
	{{118, 2}, {117, 4}, 56,  0,
		HEADER_EGPRS_DATA_TYPE_1, FAMILY_B},
	{{142, 2}, {141, 4}, 68,  0,
		HEADER_EGPRS_DATA_TYPE_1, FAMILY_A},
	{{154, 2}, {153, 4}, 74,  0,
		HEADER_EGPRS_DATA_TYPE_1, FAMILY_A},
};

const char *mcs_name(enum CodingScheme val) {
	return get_value_string(mcs_names, val);
}

bool mcs_is_gprs(enum CodingScheme cs)
{
	return CS1 <= cs && cs <= CS4;
}

bool mcs_is_edge(enum CodingScheme cs)
{
	return MCS1 <= cs && cs <= MCS9;
}

bool mcs_is_edge_gmsk(enum CodingScheme cs)
{
	if (mcs_is_edge(cs))
		return cs <= MCS4;

	return false;
}

/* Return 3GPP TS 44.060 §12.10d (EDGE) or Table 11.2.28.2 (GPRS) Channel Coding Command value */
uint8_t mcs_chan_code(enum CodingScheme cs)
{
	if (mcs_is_gprs(cs))
		return cs - CS1;

	if (mcs_is_edge(cs))
		return cs - MCS1;

	/* Defaults to (M)CS1 */
	return 0;
}

enum CodingScheme mcs_get_by_size_ul(unsigned size)
{
	switch (size) {
		case 23: return CS1;
		case 27: return MCS1;
		case 33: return MCS2;
		case 34: return CS2;
		case 40: return CS3;
		case 42: return MCS3;
		case 49: return MCS4;
		case 54: return CS4;
		case 61: return MCS5;
		case 79: return MCS6;
		case 119: return MCS7;
		case 143: return MCS8;
		case 155: return MCS9;
		default: return UNKNOWN;
	}
}

enum CodingScheme mcs_get_gprs_by_num(unsigned num)
{
	if (num < 1 || num > 4)
		return UNKNOWN;
	return CS1 + (num - 1);
}

enum CodingScheme mcs_get_egprs_by_num(unsigned num)
{
	if (num < 1 || num > 9)
		return UNKNOWN;
	return MCS1 + (num - 1);
}

bool mcs_is_valid(enum CodingScheme cs)
{
	return UNKNOWN < cs && cs <= MCS9;
}

bool mcs_is_compat_kind(enum CodingScheme cs, enum mcs_kind mode)
{
	switch (mode) {
	case GPRS: return mcs_is_gprs(cs);
	case EGPRS_GMSK: return mcs_is_edge_gmsk(cs);
	case EGPRS: return mcs_is_edge(cs);
	}

	return false;
}

bool mcs_is_compat(enum CodingScheme cs, enum CodingScheme o)
{
	return (mcs_is_gprs(cs) && mcs_is_gprs(o)) || (mcs_is_edge(cs) && mcs_is_edge(o));
}

uint8_t mcs_size_ul(enum CodingScheme cs)
{
	return mcs_info[cs].uplink.bytes + (mcs_spare_bits_ul(cs) ? 1 : 0);
}

uint8_t mcs_size_dl(enum CodingScheme cs)
{
	return mcs_info[cs].downlink.bytes + (mcs_spare_bits_dl(cs) ? 1 : 0);
}

uint8_t mcs_used_size_ul(enum CodingScheme cs)
{
	if (mcs_info[cs].data_hdr == HEADER_GPRS_DATA)
		return mcs_info[cs].uplink.bytes;
	else
		return mcs_size_ul(cs);
}

uint8_t mcs_used_size_dl(enum CodingScheme cs)
{
	if (mcs_info[cs].data_hdr == HEADER_GPRS_DATA)
		return mcs_info[cs].downlink.bytes;
	else
		return mcs_size_dl(cs);
}

uint8_t mcs_max_bytes_ul(enum CodingScheme cs)
{
	return mcs_info[cs].uplink.bytes;
}

uint8_t mcs_max_bytes_dl(enum CodingScheme cs)
{
	return mcs_info[cs].downlink.bytes;
}

uint8_t mcs_spare_bits_ul(enum CodingScheme cs)
{
	return mcs_info[cs].uplink.ext_bits;
}

uint8_t mcs_spare_bits_dl(enum CodingScheme cs)
{
	return mcs_info[cs].downlink.ext_bits;
}

uint8_t mcs_max_data_block_bytes(enum CodingScheme cs)
{
	return mcs_info[cs].data_bytes;
}

uint8_t mcs_opt_padding_bits(enum CodingScheme cs)
{
	return mcs_info[cs].optional_padding_bits;
}

void mcs_inc_kind(enum CodingScheme *cs, enum mcs_kind mode)
{
	if (!mcs_is_compat_kind(*cs, mode))
		/* This should not happen. TODO: Use assert? */
		return;

	enum CodingScheme new_cs = *cs + 1;
	if (!mcs_is_compat_kind(new_cs, mode))
		/* Clipping, do not change the value */
		return;

	*cs = new_cs;
}

void mcs_dec_kind(enum CodingScheme *cs, enum mcs_kind mode)
{
	if (!mcs_is_compat_kind(*cs, mode))
		/* This should not happen. TODO: Use assert? */
		return;

	enum CodingScheme new_cs = *cs - 1;
	if (!mcs_is_compat_kind(new_cs, mode))
		/* Clipping, do not change the value */
		return;

	*cs = new_cs;
}

void mcs_inc(enum CodingScheme *cs)
{
	if (mcs_is_gprs(*cs) && *cs == CS4)
		return;

	if (mcs_is_edge(*cs) && *cs == MCS9)
		return;

	if (!mcs_is_valid(*cs))
		return;

	*cs = *cs + 1;
}

void mcs_dec(enum CodingScheme *cs)
{
	if (mcs_is_gprs(*cs) && *cs == CS1)
		return;

	if (mcs_is_edge(*cs) && *cs == MCS1)
		return;

	if (!mcs_is_valid(*cs))
		return;

	*cs = *cs - 1;
}

bool mcs_is_family_compat(enum CodingScheme cs, enum CodingScheme o)
{
	if (cs == o)
		return true;

	if (mcs_info[cs].family == FAMILY_INVALID)
		return false;

	return mcs_info[cs].family == mcs_info[o].family;
}

void mcs_dec_to_single_block(enum CodingScheme *cs, bool *need_stuffing)
{
	switch (*cs) {
	case MCS7: *need_stuffing = false; *cs = MCS5; break;
	case MCS8: *need_stuffing =  true; *cs = MCS6; break;
	case MCS9: *need_stuffing = false; *cs = MCS6; break;
	default:   *need_stuffing = false; break;
	}
}

static struct {
	struct {
		uint8_t data_header_bits;
	} uplink, downlink;
	uint8_t data_block_header_bits;
	uint8_t num_blocks;
	const char *name;
} hdr_type_info[NUM_HEADER_TYPES] = {
	{ { 0 },         { 0 },         0, 0, "INVALID" },
	{ { 1 * 8 + 0 }, { 1 * 8 + 0 }, 0, 0, "CONTROL" },
	{ { 3 * 8 + 0 }, { 3 * 8 + 0 }, 0, 1, "GPRS_DATA" },
	{ { 5 * 8 + 6 }, { 5 * 8 + 0 }, 2, 2, "EGPRS_DATA_TYPE1" },
	{ { 4 * 8 + 5 }, { 3 * 8 + 4 }, 2, 1, "EGPRS_DATA_TYPE2" },
	{ { 3 * 8 + 7 }, { 3 * 8 + 7 }, 2, 1, "EGPRS_DATA_TYPE3" },
};

enum HeaderType mcs_header_type(enum CodingScheme mcs)
{
	return mcs_info[mcs].data_hdr;
}

uint8_t num_data_blocks(enum HeaderType ht)
{
	OSMO_ASSERT(ht < NUM_HEADER_TYPES);
	return hdr_type_info[ht].num_blocks;
}

uint8_t num_data_header_bits_UL(enum HeaderType ht)
{
	OSMO_ASSERT(ht < NUM_HEADER_TYPES);
	return hdr_type_info[ht].uplink.data_header_bits;
}

uint8_t num_data_header_bits_DL(enum HeaderType ht)
{
	OSMO_ASSERT(ht < NUM_HEADER_TYPES);
	return hdr_type_info[ht].downlink.data_header_bits;
}

uint8_t num_data_block_header_bits(enum HeaderType ht)
{
	OSMO_ASSERT(ht < NUM_HEADER_TYPES);
	return hdr_type_info[ht].data_block_header_bits;
}

const struct value_string mode_names[] = {
	{ GPRS, "GPRS" },
	{ EGPRS_GMSK, "EGPRS_GMSK-only"},
	{ EGPRS, "EGPRS"},
	{ 0, NULL }
};

const char *mode_name(enum mcs_kind val) {
	return get_value_string(mode_names, val);
}

/* FIXME: take into account padding and special cases of commanded MCS (MCS-6-9 and MCS-5-7) */
enum CodingScheme get_retx_mcs(enum CodingScheme initial_mcs, enum CodingScheme commanded_mcs, bool resegment_bit)
{
	OSMO_ASSERT(mcs_is_edge(initial_mcs));
	OSMO_ASSERT(mcs_is_edge(commanded_mcs));
	OSMO_ASSERT(NUM_SCHEMES - MCS1 == 9);

	if (resegment_bit) { /* 3GPP TS 44.060 Table 8.1.1.1, reflected over antidiagonal */
		enum CodingScheme egprs_reseg[NUM_SCHEMES - MCS1][NUM_SCHEMES - MCS1] = {
			{ MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1 },
			{ MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2 },
			{ MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3 },
			{ MCS1, MCS1, MCS1, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4 },
			{ MCS2, MCS2, MCS2, MCS2, MCS5, MCS5, MCS7, MCS7, MCS7 },
			{ MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS6, MCS9 },
			{ MCS2, MCS2, MCS2, MCS2, MCS5, MCS5, MCS7, MCS7, MCS7 },
			{ MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS8, MCS8 },
			{ MCS3, MCS3, MCS3, MCS3, MCS3, MCS6, MCS6, MCS6, MCS9 },
		};
		return egprs_reseg[mcs_chan_code(initial_mcs)][mcs_chan_code(commanded_mcs)];
	} else { /* 3GPP TS 44.060 Table 8.1.1.2, reflected over antidiagonal */
		enum CodingScheme egprs_no_reseg[NUM_SCHEMES - MCS1][NUM_SCHEMES - MCS1] = {
			{ MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1, MCS1 },
			{ MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2, MCS2 },
			{ MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3, MCS3 },
			{ MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4, MCS4 },
			{ MCS5, MCS5, MCS5, MCS5, MCS5, MCS5, MCS7, MCS7, MCS7 },
			{ MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS9 },
			{ MCS5, MCS5, MCS5, MCS5, MCS5, MCS5, MCS7, MCS7, MCS7 },
			{ MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS8, MCS8 },
			{ MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS6, MCS9 },
		};
		return egprs_no_reseg[mcs_chan_code(initial_mcs)][mcs_chan_code(commanded_mcs)];
	}
}
