namespace YandexMusic.API;

/// <summary>Главный класс API Яндекс Музыки. Предоставляет доступ ко всем веткам API.</summary>
public class YandexMusicApi
{
    /// <summary>API для работы с альбомами.</summary>
    public YAlbumAPI Album { get; internal set; } = null!;
    /// <summary>API для работы с исполнителями.</summary>
    public YArtistAPI Artist { get; internal set; } = null!;
    /// <summary>API для работы с лейблами.</summary>
    public YLabelAPI Label { get; internal set; } = null!;
    /// <summary>API для работы с главной страницей (лендингом).</summary>
    public YLandingAPI Landing { get; internal set; } = null!;
    /// <summary>API для работы с библиотекой (лайки, дизлайки).</summary>
    public YLibraryAPI Library { get; internal set; } = null!;
    /// <summary>API для работы с плейлистами.</summary>
    public YPlaylistAPI Playlist { get; internal set; } = null!;
    /// <summary>API для работы с закреплёнными объектами.</summary>
    public YPinsAPI Pins { get; internal set; } = null!;
    /// <summary>API для работы с радио.</summary>
    public YRadioAPI Radio { get; internal set; } = null!;
    /// <summary>API для поиска.</summary>
    public YSearchAPI Search { get; internal set; } = null!;
    /// <summary>API для работы с треками.</summary>
    public YTrackAPI Track { get; internal set; } = null!;
    /// <summary>API для работы с очередями.</summary>
    public YQueueAPI Queue { get; internal set; } = null!;
    /// <summary>API для работы с пользователем и авторизацией.</summary>
    public YUserAPI User { get; internal set; } = null!;
    /// <summary>API для загрузки пользовательского контента.</summary>
    public YUgcAPI UserGeneratedContent { get; internal set; } = null!;
    /// <summary>API для работы с протоколом Ynison (WebSocket).</summary>
    public YYnisonAPI Ynison { get; internal set; } = null!;

    /// <summary>Создаёт экземпляр API с инициализацией всех подсистем.</summary>
    public YandexMusicApi()
    {
        foreach (var property in GetType().GetProperties())
            property.SetValue(this, Activator.CreateInstance(property.PropertyType, this));
    }
}