#include <stdio.h>
#include <osmocom/core/talloc.h>
#include <osmocom/abis/abis.h>
#include <osmocom/abis/e1_input.h>
#include <osmocom/core/application.h>
#include <osmocom/core/logging.h>
#include <osmocom/gsm/protocol/gsm_12_21.h>

static void *tall_test;
static struct e1inp_sign_link *oml_sign_link, *rsl_sign_link;

#define DBSCTEST 0

struct log_info_cat bsc_test_cat[] = {
	[DBSCTEST] = {
		.name = "DBSCTEST",
		.description = "BSC-mode test",
		.color = "\033[1;35m",
		.enabled = 1, .loglevel = LOGL_NOTICE,
	},
};

static struct e1inp_sign_link *
sign_link_up(void *dev, struct e1inp_line *line, enum e1inp_sign_type type)
{
	struct e1inp_sign_link *sign_link = NULL;

	LOGP(DBSCTEST, LOGL_NOTICE, "Signal link up request received.\n");
	e1inp_ts_config_sign(&line->ts[E1INP_SIGN_OML - 1], line);
	sign_link = oml_sign_link =
		e1inp_sign_link_create(&line->ts[E1INP_SIGN_OML - 1],
				       E1INP_SIGN_OML, NULL, 255, 0);
	if (!oml_sign_link) {
		LOGP(DBSCTEST, LOGL_ERROR, "OML link not yet set, giving up\n");
		return NULL;
	}
	e1inp_ts_config_sign(&line->ts[E1INP_SIGN_RSL - 1], line);
	sign_link = rsl_sign_link =
	     e1inp_sign_link_create(&line->ts[E1INP_SIGN_RSL - 1],
				    E1INP_SIGN_RSL, NULL, 0, 0);
	if (sign_link)
		LOGP(DBSCTEST, LOGL_NOTICE, "signal link has been set up.\n");

	return sign_link;
}

static void sign_link_down(struct e1inp_line *line)
{
	LOGP(DBSCTEST, LOGL_NOTICE, "signal link has been closed\n");
	if (oml_sign_link)
		e1inp_sign_link_destroy(oml_sign_link);
	if (rsl_sign_link)
		e1inp_sign_link_destroy(rsl_sign_link);
}

static void fill_om_hdr(struct abis_om_hdr *oh, uint8_t len)
{
	oh->mdisc = ABIS_OM_MDISC_FOM;
	oh->placement = ABIS_OM_PLACEMENT_ONLY;
	oh->sequence = 0;
	oh->length = len;
}

static void fill_om_fom_hdr(struct abis_om_hdr *oh, uint8_t len,
                            uint8_t msg_type, uint8_t obj_class,
                            uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr)
{
	struct abis_om_fom_hdr *foh =
		(struct abis_om_fom_hdr *) oh->data;

	fill_om_hdr(oh, len+sizeof(*foh));
	foh->msg_type = msg_type;
	foh->obj_class = obj_class;
	foh->obj_inst.bts_nr = bts_nr;
	foh->obj_inst.trx_nr = trx_nr;
	foh->obj_inst.ts_nr = ts_nr;
}

#define OM_ALLOC_SIZE           1024
#define OM_HEADROOM_SIZE        128

static struct msgb *nm_msgb_alloc(void)
{
	return msgb_alloc_headroom(OM_ALLOC_SIZE, OM_HEADROOM_SIZE, "OML");
}


static int abis_nm_sw_act_req_ack(struct e1inp_sign_link *sign_link,
				  uint8_t obj_class,
				  uint8_t i1, uint8_t i2, uint8_t i3,
				  uint8_t *attr, int att_len)
{
	struct abis_om_hdr *oh;
	struct msgb *msg = nm_msgb_alloc();
	uint8_t msgtype = NM_MT_SW_ACT_REQ_ACK;

	oh = (struct abis_om_hdr *) msgb_put(msg, ABIS_OM_FOM_HDR_SIZE);
	fill_om_fom_hdr(oh, att_len, msgtype, obj_class, i1, i2, i3);

	if (attr) {
		uint8_t *ptr = msgb_put(msg, att_len);
		memcpy(ptr, attr, att_len);
	}
	msg->dst = sign_link;
	return abis_sendmsg(msg);
}

static int abis_nm_rx_sw_act_req(struct msgb *msg)
{
	struct abis_om_hdr *oh = msgb_l2(msg);
	struct abis_om_fom_hdr *foh = msgb_l3(msg);
	int ret;

        ret = abis_nm_sw_act_req_ack(msg->dst,
				     foh->obj_class,
				     foh->obj_inst.bts_nr,
				     foh->obj_inst.trx_nr,
				     foh->obj_inst.ts_nr,
				     foh->data, oh->length-sizeof(*foh));

	return ret;
}

static int abis_nm_rcvmsg_fom(struct msgb *msg)
{
	struct abis_om_fom_hdr *foh = msgb_l3(msg);
	uint8_t mt = foh->msg_type;
	int ret = 0;

	switch (mt) {
	case NM_MT_SW_ACT_REQ:	/* Software activate request from BTS. */
		ret = abis_nm_rx_sw_act_req(msg);
		break;
	default:
		break;
	}
	return ret;
}

static int abis_nm_rcvmsg(struct msgb *msg)
{
	int ret = 0;
	struct abis_om_hdr *oh = msgb_l2(msg);

	msg->l3h = (unsigned char *)oh + sizeof(*oh);
	switch (oh->mdisc) {
	case ABIS_OM_MDISC_FOM:
		ret = abis_nm_rcvmsg_fom(msg);
		break;
	default:
		LOGP(DBSCTEST, LOGL_ERROR, "unknown OML message\n");
		break;
	}
	return ret;
}

static int sign_link(struct msgb *msg)
{
	int ret = 0;
	struct e1inp_sign_link *link = msg->dst;

	switch(link->type) {
	case E1INP_SIGN_RSL:
		LOGP(DBSCTEST, LOGL_NOTICE, "RSL message received.\n");
		break;
	case E1INP_SIGN_OML:
		LOGP(DBSCTEST, LOGL_NOTICE, "OML message received.\n");
		ret = abis_nm_rcvmsg(msg);
		break;
	default:
		LOGP(DBSCTEST, LOGL_ERROR, "Unknown signallin message.\n");
		break;
	}
	return ret;
}

const struct log_info bsc_test_log_info = {
        .filter_fn = NULL,
        .cat = bsc_test_cat,
        .num_cat = ARRAY_SIZE(bsc_test_cat),
};

int main(void)
{
	struct e1inp_line *line;

	tall_test = talloc_named_const(NULL, 1, "e1inp_test");
	libosmo_abis_init(tall_test);

	osmo_init_logging(&bsc_test_log_info);

	struct e1inp_line_ops ops = {
		.addr		= "0.0.0.0",
		.role		= E1INP_LINE_R_BSC,
		.sign_link_up	= sign_link_up,
		.sign_link_down	= sign_link_down,
		.sign_link	= sign_link,
	};

#define LINENR 0

	line = e1inp_line_create(LINENR, "hsl");
	if (line == NULL) {
		LOGP(DBSCTEST, LOGL_ERROR, "problem creating E1 line\n");
		exit(EXIT_FAILURE);
	}

	e1inp_line_bind_ops(line, &ops);

	/*
	 * Depending if this is a real or virtual E1 lines:
	 * - real (ISDN): create signal link for OML and RSL before line up.
	 * - vitual (INET): we create it in signal_link_up(...) callback.
	 *
	 * The signal link is created via e1inp_sign_link_create(...)
	 *
	 * See e1_reconfig_trx and e1_reconfig_bts in libbsc/e1_config.c,
	 * it explains how this is done with ISDN.
	 */

	if (e1inp_line_update(line) < 0) {
		LOGP(DBSCTEST, LOGL_ERROR, "problem creating E1 line\n");
		exit(EXIT_FAILURE);
	}

	LOGP(DBSCTEST, LOGL_NOTICE, "entering main loop\n");

	while (1) {
		osmo_select_main(0);
	}
	return 0;
}
