/* main.c - Application main entry point */

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

#include <zephyr/kernel.h>
#include <zephyr/device.h>

#include <zephyr/drivers/gpio.h>

#include <zephyr/sys/util.h>
#include <zephyr/sys/printk.h>

#include <zephyr/bluetooth/conn.h>

#include <zephyr/logging/log.h>

#include "common.h"

LOG_MODULE_DECLARE(ead_peripheral_sample, CONFIG_BT_EAD_LOG_LEVEL);

/*
 * Get button configuration from the devicetree sw0 alias. This is mandatory.
 */
#define SW0_NODE DT_ALIAS(sw0)
#if !DT_NODE_HAS_STATUS(SW0_NODE, okay)
#error "Unsupported board: sw0 devicetree alias is not defined"
#endif
static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET_OR(SW0_NODE, gpios, {0});
static struct gpio_callback button_cb_data;

extern int run_peripheral_sample(int get_passkey_confirmation(struct bt_conn *conn));

static struct k_poll_signal button_pressed_signal;

static void button_pressed(const struct device *dev, struct gpio_callback *cb, uint32_t pins)
{
	LOG_DBG("Button pressed...");

	k_poll_signal_raise(&button_pressed_signal, 0);
	k_sleep(K_SECONDS(1));
	k_poll_signal_reset(&button_pressed_signal);
}

static int get_passkey_confirmation(struct bt_conn *conn)
{
	int err;

	printk("Confirm passkey by pressing button at %s pin %d...\n", button.port->name,
	       button.pin);

	await_signal(&button_pressed_signal);

	err = bt_conn_auth_passkey_confirm(conn);
	if (err) {
		LOG_DBG("Failed to confirm passkey.");
		return -1;
	}

	printk("Passkey confirmed.\n");

	return 0;
}

static int setup_btn(void)
{
	int ret;

	k_poll_signal_init(&button_pressed_signal);

	if (!gpio_is_ready_dt(&button)) {
		LOG_ERR("Error: button device %s is not ready", button.port->name);
		return -1;
	}

	ret = gpio_pin_configure_dt(&button, GPIO_INPUT);
	if (ret != 0) {
		LOG_ERR("Error %d: failed to configure %s pin %d", ret, button.port->name,
			button.pin);
		return -1;
	}

	ret = gpio_pin_interrupt_configure_dt(&button, GPIO_INT_EDGE_TO_ACTIVE);
	if (ret != 0) {
		LOG_ERR("Error %d: failed to configure interrupt on %s pin %d", ret,
			button.port->name, button.pin);
		return -1;
	}

	gpio_init_callback(&button_cb_data, button_pressed, BIT(button.pin));
	gpio_add_callback(button.port, &button_cb_data);
	LOG_DBG("Set up button at %s pin %d", button.port->name, button.pin);

	return 0;
}

int main(void)
{
	int err;

	err = setup_btn();
	if (err) {
		return 0;
	}

	LOG_DBG("Starting peripheral sample...");

	(void)run_peripheral_sample(get_passkey_confirmation);
	return 0;
}
