using YandexMusic.API.Common;
using YandexMusic.API.Models.Common;
using YandexMusic.API.Models.Radio;
using YandexMusic.API.Models.Track;
using YandexMusic.API.Requests.Radio;

namespace YandexMusic.API;

/// <summary>
/// API для взаимодействия с радио
/// </summary>
public partial class YRadioAPI : YCommonAPI
{
    public YRadioAPI(YandexMusicApi yandex) : base(yandex)
    {
    }

    /// <summary>
    /// Получение списка рекомендованных радиостанций
    /// </summary>
    /// <param name="storage">Хранилище</param>
    /// <returns></returns>
    public Task<YResponse<YStationsDashboard>> GetStationsDashboardAsync(AuthStorage storage)
    {
        return new YGetStationsDashboardBuilder(api, storage)
            .Build(null)
            .GetResponseAsync();
    }

    /// <summary>
    /// Получение списка радиостанций
    /// </summary>
    /// <param name="storage">Хранилище</param>
    /// <returns></returns>
    public Task<YResponse<List<YStation>>> GetStationsAsync(AuthStorage storage)
    {
        return new YGetStationsBuilder(api, storage)
            .Build(null)
            .GetResponseAsync();
    }

    /// <summary>
    /// Получение информации о радиостанции
    /// </summary>
    /// <param name="storage">Хранилище</param>
    /// <param name="type">Тип</param>
    /// <param name="tag">Тэг</param>
    /// <returns></returns>
    public Task<YResponse<List<YStation>>> GetStationAsync(AuthStorage storage, string type, string tag)
    {
        return new YGetStationBuilder(api, storage)
            .Build((type, tag))
            .GetResponseAsync();
    }

    /// <summary>
    /// Получение информации о радиостанции
    /// </summary>
    /// <param name="storage">Хранилище</param>
    /// <param name="id">Идентификатор станции</param>
    /// <returns></returns>
    public Task<YResponse<List<YStation>>> GetStationAsync(AuthStorage storage, YStationId id)
    {
        return GetStationAsync(storage, id.Type, id.Tag);
    }

    /// <summary>
    /// Получение последовательности треков радиостанции
    /// </summary>
    /// <param name="storage">Хранилище</param>
    /// <param name="station">Радиостанция</param>
    /// <param name="prevTrackId">Идентификатор предыдущего трека</param>
    /// <returns></returns>
    public Task<YResponse<YStationSequence>> GetStationTracksAsync(AuthStorage storage, YStation station, string prevTrackId = "")
    {
        return new YGetStationTracksBuilder(api, storage)
            .Build((station.Station, prevTrackId))
            .GetResponseAsync();
    }

    /// <summary>
    /// Установка настроек подбора треков
    /// </summary>
    /// <param name="storage">Хранилище</param>
    /// <param name="station">Радиостанция</param>
    /// <param name="settings">Настройки</param>
    /// <returns></returns>
    public Task<YResponse<string>> SetStationSettings2Async(AuthStorage storage, YStation station, YStationSettings2 settings)
    {
        return new YSetSettings2Builder(api, storage)
            .Build((station.Station, settings))
            .GetResponseAsync();
    }

    /// <summary>
    /// Отправка обратной связи на действия при прослушивании радио
    /// </summary>
    /// <param name="storage">Хранилище</param>
    /// <param name="station">Радиостанция</param>
    /// <param name="type">Тип обратной связи</param>
    /// <param name="track">Трек</param>
    /// <param name="batchId">Уникальный идентификатор партии треков. Возвращается при получении треков</param>
    /// <param name="totalPlayedSeconds">Сколько было проиграно секунд трека перед действием</param>
    /// <returns></returns>
    public Task<string> SendStationFeedBackAsync(AuthStorage storage, YStation station, YStationFeedbackType type, YTrack track = null, string batchId = "", double totalPlayedSeconds = 0)
    {
        return new YSetStationFeedbackBuilder(api, storage)
            .Build((type, station, track, batchId, totalPlayedSeconds))
            .GetResponseAsync();
    }


}