// SPDX-License-Identifier: BSD-3-Clause
// Copyright The Music Player Daemon Project

/*! \file
 * \brief MPD client library
 *
 * Do not include this header directly.  Use mpd/client.h instead.
 */

#ifndef MPD_STATS_H
#define MPD_STATS_H

#include "compiler.h"

#include <stdbool.h>

struct mpd_connection;
struct mpd_pair;

/**
 * \struct mpd_stats
 *
 * An opaque object representing MPD's response to the "stats"
 * command.  To release this object, call mpd_stats_free().
 */
struct mpd_stats;

#ifdef __cplusplus
extern "C" {
#endif

/**
 * Send the "stats" command to MPD. Call mpd_recv_stats() to read the response.
 *
 * @return true on success
 */
bool
mpd_send_stats(struct mpd_connection *connection);

/**
 * Begins parsing server stats: creates a new empty #mpd_stats object.
 * Free it with mpd_stats_free().
 *
 * @return the newly allocated #mpd_stats object, or NULL if out of
 * memory
 */
mpd_malloc
struct mpd_stats *
mpd_stats_begin(void);

/**
 * Parses the pair, adding its information to the specified #mpd_stats
 * object.
 */
void
mpd_stats_feed(struct mpd_stats *stats, const struct mpd_pair *pair);

/**
 * Reads the "stats" response from MPD.
 *
 * @return a #mpd_stats object, or NULL on error
 */
mpd_malloc
struct mpd_stats *
mpd_recv_stats(struct mpd_connection *connection);

/**
 * Shortcut for mpd_send_stats() and mpd_recv_stats().
 */
mpd_malloc
struct mpd_stats *
mpd_run_stats(struct mpd_connection *connection);

/**
 * Frees a #mpd_stats object.
 */
void mpd_stats_free(struct mpd_stats *stats);

/**
 * @return the number of distinct artists in MPD's database, or 0 if
 * unknown
 */
mpd_pure
unsigned
mpd_stats_get_number_of_artists(const struct mpd_stats *stats);

/**
 * @return the number of distinct album names in MPD's database, or 0
 * if unknown
 */
mpd_pure
unsigned
mpd_stats_get_number_of_albums(const struct mpd_stats *stats);

/**
 * @return the total number of song files in MPD's database, or 0 if
 * unknown
 */
mpd_pure
unsigned
mpd_stats_get_number_of_songs(const struct mpd_stats *stats);

/**
 * @return the uptime of MPD in seconds, or 0 if unknown
 */
mpd_pure
unsigned long mpd_stats_get_uptime(const struct mpd_stats *stats);

/**
 * @return the UNIX time stamp of the last database update, or 0 if
 * unknown
 */
mpd_pure
unsigned long mpd_stats_get_db_update_time(const struct mpd_stats *stats);

/**
 * @return the accumulated time MPD was playing music since the
 * process was started, or 0 if unknown
 */
mpd_pure
unsigned long mpd_stats_get_play_time(const struct mpd_stats *stats);

/**
 * @return the accumulated duration of all songs in the database, or 0
 * if unknown
 */
mpd_pure
unsigned long mpd_stats_get_db_play_time(const struct mpd_stats *stats);

#ifdef __cplusplus
}
#endif

#endif