/**
 * @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_

#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
 * The media control specification has a requirement that the speed factor
 * shall be [-64, -4], 0, [4, 64].  I.e., values between 0 and +/- 4 are not allowed.
 * 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  4


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

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

/* Groups */
struct mpl_group {
#if defined(CONFIG_BT_MPL_OBJECTS) || defined(CONFIG_BT_OTS_CLIENT)
	uint64_t             id;
#endif /* CONFIG_BT_MPL_OBJECTS || CONFIG_BT_OTS_CLIENT */
	char                 title[CONFIG_BT_MPL_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_MPL_MEDIA_PLAYER_NAME_MAX];
#if defined(CONFIG_BT_MPL_OBJECTS) || defined(CONFIG_BT_OTS_CLIENT)
	uint64_t            icon_id;
#endif /* CONFIG_BT_MPL_OBJECTS || CONFIG_BT_OTS_CLIENT */
	char                icon_url[CONFIG_BT_MPL_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_MPL_OBJECTS) || defined(CONFIG_BT_OTS_CLIENT)
	uint64_t            search_results_id;
#endif /* CONFIG_BT_MPL_OBJECTS || CONFIG_BT_OTS_CLIENT */
	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 playing 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_*/
