/**
 * @file
 * @brief Internal header for the media player (MPL).
 *
 * Copyright (c) 2019 - 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_SUBSYS_BLUETOOTH_AUDIO_MPL_INTERNAL_
#define ZEPHYR_SUBSYS_BLUETOOTH_AUDIO_MPL_INTERNAL_

#include <bluetooth/audio/media_proxy.h>

#ifdef __cplusplus
extern "C" {
#endif


/* Offset into a segment/track before the "previous" command goes to start of */
/* current segment/track instead to previous */
#define PREV_MARGIN           500  /* 500 * 0.01 = 5 seconds */

/* Increase/decrease in seeking sped factor for fast rewind/forward commands
 * Set this equal to the minimum speed factor, to ensure only valid speed factors
 * are used when changing to/from zero
 */
#define MPL_SEEKING_SPEED_FACTOR_STEP  BT_MCS_SEEKING_SPEED_FACTOR_MIN


/* Track segments */
struct mpl_tseg {
	uint8_t            name_len;
	char		   name[CONFIG_BT_MCS_SEGMENT_NAME_MAX];
	int32_t            pos;
	struct mpl_tseg   *prev;
	struct mpl_tseg   *next;
};

/* Tracks */
struct mpl_track {
#if defined(CONFIG_BT_OTS) || defined(CONFIG_BT_OTC)
	uint64_t             id;
#endif /* CONFIG_BT_OTS || CONFIG_BT_OTC */
	char                 title[CONFIG_BT_MCS_TRACK_TITLE_MAX];
	int32_t              duration;
	struct mpl_tseg     *segment;
#if defined(CONFIG_BT_OTS) || defined(CONFIG_BT_OTC)
	uint64_t             segments_id;
#endif /* CONFIG_BT_OTS || CONFIG_BT_OTC */
	struct mpl_track    *prev;
	struct mpl_track    *next;
};

/* Groups */
struct mpl_group {
#if defined(CONFIG_BT_OTS) || defined(CONFIG_BT_OTC)
	uint64_t             id;
#endif /* CONFIG_BT_OTS || CONFIG_BT_OTC */
	char                 title[CONFIG_BT_MCS_GROUP_TITLE_MAX];
	struct mpl_track    *track;
	struct mpl_group    *parent;
	struct mpl_group    *prev;
	struct mpl_group    *next;
};

/** @brief Media Player */
struct mpl_mediaplayer   {
	char                name[CONFIG_BT_MCS_MEDIA_PLAYER_NAME_MAX];
#if defined(CONFIG_BT_OTS) || defined(CONFIG_BT_OTC)
	uint64_t            icon_id;
#endif /* CONFIG_BT_OTS || CONFIG_BT_OTC */
	char                icon_url[CONFIG_BT_MCS_ICON_URL_MAX];
	struct mpl_group   *group;
	int32_t             track_pos;
	uint8_t             state;
	int8_t              playback_speed_param;
	int8_t              seeking_speed_factor;
	uint8_t             playing_order;
	uint16_t            playing_orders_supported;
	uint32_t            opcodes_supported;
#if defined(CONFIG_BT_OTS) || defined(CONFIG_BT_OTC)
	uint64_t            search_results_id;
#endif /* CONFIG_BT_OTS || CONFIG_BT_OTC */
	uint8_t             content_ctrl_id;
	struct media_proxy_pl_calls calls;

	bool                        next_track_set; /* If next track explicitly set */
	struct {
		struct mpl_track    *track; /* The track explicitly set as next track */
		struct mpl_group    *group; /* The group of the set track */
	} next;
};


/* Special calls for testing */

/* For  IOP testing - set current group to be it's own parent */
void mpl_test_unset_parent_group(void);

/* Force the media player into a given state */
void mpl_test_media_state_set(uint8_t state);

/* Trigger track changed callback */
void mpl_test_track_changed_cb(void);

/* Trigger title changed callback */
void mpl_test_title_changed_cb(void);

/* Trigger duration changed callback */
void mpl_test_duration_changed_cb(void);

/* Trigger position changed callback */
void mpl_test_position_changed_cb(void);

/* Trigger playback speed changed callback */
void mpl_test_playback_speed_changed_cb(void);

/* Trigger seeking speed changed callback */
void mpl_test_seeking_speed_changed_cb(void);

/* Trigger current track id changed callback */
void mpl_test_current_track_id_changed_cb(void);

/* Trigger next track id changed callback */
void mpl_test_next_track_id_changed_cb(void);

/* Trigger current group id changed callback */
void mpl_test_current_group_id_changed_cb(void);

/* Trigger parent group id changed callback */
void mpl_test_parent_group_id_changed_cb(void);

/* Trigger playinge order changed callback */
void mpl_test_playing_order_changed_cb(void);

/* Trigger media state changed callback */
void mpl_test_media_state_changed_cb(void);

/* Trigger operations supported changed callback */
void mpl_test_opcodes_supported_changed_cb(void);

/* Trigger search results changed callback */
void mpl_test_search_results_changed_cb(void);

/* Output the mediaplayer's state information */
void mpl_debug_dump_state(void);

#ifdef __cplusplus
}
#endif

#endif /* ZEPHYR_SUBSYS_BLUETOOTH_AUDIO_MPL_INTERNAL_*/
