/** @file
 *  @brief Internal header for Bluetooth BAP.
 */

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

#include <stdbool.h>
#include <stdint.h>

#include <zephyr/bluetooth/audio/audio.h>
#include <zephyr/bluetooth/audio/bap.h>
#include <zephyr/bluetooth/addr.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/sys/util_macro.h>
#include <zephyr/types.h>

#define BT_BAP_BASS_SCAN_STATE_NOT_SCANNING   0x00
#define BT_BAP_BASS_SCAN_STATE_SCANNING       0x01

#define BT_BAP_BASS_OP_SCAN_STOP              0x00
#define BT_BAP_BASS_OP_SCAN_START             0x01
#define BT_BAP_BASS_OP_ADD_SRC                0x02
#define BT_BAP_BASS_OP_MOD_SRC                0x03
#define BT_BAP_BASS_OP_BROADCAST_CODE         0x04
#define BT_BAP_BASS_OP_REM_SRC                0x05

#define BT_BAP_BASS_SCAN_STATE_IDLE           0x00
#define BT_BAP_BASS_SCAN_STATE_SCANNING       0x01
#define BT_BAP_BASS_SCAN_STATE_FAILED         0x02
#define BT_BAP_BASS_SCAN_STATE_SYNCED         0x03

#define BT_BAP_BASS_PA_REQ_NO_SYNC            0x00
#define BT_BAP_BASS_PA_REQ_SYNC_PAST          0x01
#define BT_BAP_BASS_PA_REQ_SYNC               0x02

#define BT_BAP_BASS_VALID_OPCODE(opcode) ((opcode) <= BT_BAP_BASS_OP_REM_SRC)

struct bt_bap_bass_cp_scan_stop {
	uint8_t opcode;
} __packed;

struct bt_bap_bass_cp_scan_start {
	uint8_t opcode;
} __packed;

struct bt_bap_bass_cp_subgroup {
	uint32_t bis_sync;
	uint8_t metadata_len;
	uint8_t metadata[0];
} __packed;

struct bt_bap_bass_cp_add_src {
	uint8_t opcode;
	bt_addr_le_t addr;
	uint8_t adv_sid;
	uint8_t broadcast_id[BT_AUDIO_BROADCAST_ID_SIZE];
	uint8_t pa_sync;
	uint16_t pa_interval;
	uint8_t num_subgroups;
	struct bt_bap_bass_cp_subgroup subgroups[0];
} __packed;

struct bt_bap_bass_cp_mod_src {
	uint8_t opcode;
	uint8_t src_id;
	uint8_t pa_sync;
	uint16_t pa_interval;
	uint8_t num_subgroups;
	struct bt_bap_bass_cp_subgroup subgroups[0];
} __packed;

struct bt_bap_bass_cp_broadcase_code {
	uint8_t opcode;
	uint8_t src_id;
	uint8_t broadcast_code[16];
} __packed;

struct bt_bap_bass_cp_rem_src {
	uint8_t opcode;
	uint8_t src_id;
} __packed;

union bt_bap_bass_cp {
	uint8_t opcode;
	struct bt_bap_bass_cp_scan_stop scan_stop;
	struct bt_bap_bass_cp_scan_start scan_start;
	struct bt_bap_bass_cp_add_src add_src;
	struct bt_bap_bass_cp_mod_src mod_src;
	struct bt_bap_bass_cp_broadcase_code broadcast_code;
	struct bt_bap_bass_cp_rem_src rem_src;
};

static inline const char *bt_bap_pa_state_str(uint8_t state)
{
	switch (state) {
	case BT_BAP_PA_STATE_NOT_SYNCED:
		return "Not synchronized to PA";
	case BT_BAP_PA_STATE_INFO_REQ:
		return "SyncInfo Request";
	case BT_BAP_PA_STATE_SYNCED:
		return "Synchronized to PA";
	case BT_BAP_PA_STATE_FAILED:
		return "Failed to synchronize to PA";
	case BT_BAP_PA_STATE_NO_PAST:
		return "No PAST";
	default:
		return "unknown state";
	}
}

static inline const char *bt_bap_big_enc_state_str(uint8_t state)
{
	switch (state) {
	case BT_BAP_BIG_ENC_STATE_NO_ENC:
		return "Not encrypted";
	case BT_BAP_BIG_ENC_STATE_BCODE_REQ:
		return "Broadcast_Code required";
	case BT_BAP_BIG_ENC_STATE_DEC:
		return "Decrypting";
	case BT_BAP_BIG_ENC_STATE_BAD_CODE:
		return "Bad_Code (incorrect encryption key)";
	default:
		return "unknown state";
	}
}

static inline bool valid_bis_syncs(uint32_t bis_sync)
{
	if (bis_sync == BT_BAP_BIS_SYNC_NO_PREF) {
		return true;
	}

	if (bis_sync > BIT_MASK(31)) { /* Max BIS index */
		return false;
	}

	return true;
}
