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

#include <ctype.h>

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

#include "common.h"

#include <zephyr/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");
}
