#include <stdio.h>
#include <osmocom/core/talloc.h>
#include <osmocom/abis/abis.h>
#include <osmocom/abis/e1_input.h>
#include <osmocom/abis/ipa_proxy.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/application.h>
#include <osmocom/vty/vty.h>
#include <osmocom/vty/command.h>
#include <osmocom/vty/telnet_interface.h>
#include "internal.h"
#include "config.h"

static void *tall_test;

#define DIPA_PROXY_TEST 0

struct log_info_cat ipa_proxy_test_cat[] = {
	[DIPA_PROXY_TEST] = {
		.name = "DLINP_IPA_PROXY_TEST",
		.description = "IPA proxy test",
		.color = "\033[1;35m",
		.enabled = 1, .loglevel = LOGL_NOTICE,
	},
};

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

static int bsc_vty_is_config_node(struct vty *vty, int node)
{
	switch(node) {
	case L_IPA_NODE:
		return 1;
		break;
	}
	return 0;
}

static enum node_type bsc_vty_go_parent(struct vty *vty)
{
	switch (vty->node) {
	case L_IPA_NODE:
		vty->node = VIEW_NODE;
		break;
	}
	return vty->node;
}

static struct vty_app_info vty_info = {
	.name		= "ipa-proxy-test",
	.version	= PACKAGE_VERSION,
	.go_parent_cb	= bsc_vty_go_parent,
	.is_config_node	= bsc_vty_is_config_node,
};

#define IPA_PROXY_TEST_TELNET_PORT	4260

int main(void)
{
	tall_test = talloc_named_const(NULL, 1, "ipa proxy test");
	libosmo_abis_init(tall_test);

	osmo_init_logging(&ipa_proxy_test_log_info);

	vty_init(&vty_info);
	ipa_proxy_vty_init();

	telnet_init(tall_test, NULL, IPA_PROXY_TEST_TELNET_PORT);

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

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