/*
 * Copyright (c) 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <ctype.h>

#include <console/console.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/iso.h>

#include "common.h"

#include <logging/log.h>
LOG_MODULE_REGISTER(iso_broadcast_main, LOG_LEVEL_DBG);

enum benchmark_role {
	ROLE_RECEIVER,
	ROLE_BROADCASTER,
	ROLE_QUIT
};

static enum benchmark_role device_role_select(void)
{
	char role;

	while (true) {
		printk("Choose device role - type r (receiver role) or b "
		       "(broadcaster role), or q to quit: ");

		role = tolower(console_getchar());

		printk("%c\n", role);

		if (role == 'r') {
			printk("Receiver role\n");
			return ROLE_RECEIVER;
		} else if (role == 'b') {
			printk("Broadcaster role\n");
			return ROLE_BROADCASTER;
		} else if (role == 'q') {
			printk("Quitting\n");
			return ROLE_QUIT;
		} else if (role == '\n') {
			continue;
		}

		printk("Invalid role: %c\n", role);
	}
}

void main(void)
{
	int err;
	enum benchmark_role role;

	LOG_INF("Starting Bluetooth Throughput example");

	err = bt_enable(NULL);
	if (err != 0) {
		LOG_INF("Bluetooth init failed (err %d)", err);
		return;
	}

	err = console_init();
	if (err != 0) {
		LOG_INF("Console init failed (err %d)", err);
		return;
	}

	LOG_INF("Bluetooth initialized");


	while (true) {
		role = device_role_select();

		if (role == ROLE_RECEIVER) {
			err = test_run_receiver();
		} else if (role == ROLE_BROADCASTER) {
			err = test_run_broadcaster();
		} else {
			if (role != ROLE_QUIT) {
				LOG_INF("Invalid role %u", role);
				continue;
			} else {
				err = 0;
				break;
			}
		}

		LOG_INF("Test complete %d", err);
	}

	LOG_INF("Exiting");
}
