// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.

using System.Collections.Generic;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Game.Beatmaps;
using osu.Game.Graphics.UserInterface;
using osu.Game.Scoring;

namespace osu.Game.Screens.Select
{
    /// <summary>
    /// Actions exposed by song select which are used by subcomponents to perform top-level operations.
    /// </summary>
    [Cached]
    public interface ISongSelect
    {
        /// <summary>
        /// Requests the user for confirmation to delete the given beatmap set.
        /// </summary>
        void Delete(BeatmapSetInfo beatmapBeatmapSetInfo);

        /// <summary>
        /// Immediately restores any hidden beatmaps in the provided beatmap set.
        /// </summary>
        void RestoreAllHidden(BeatmapSetInfo beatmapSet);

        /// <summary>
        /// Opens the manage collections dialog.
        /// </summary>
        void ManageCollections();

        /// <summary>
        /// Whether <see cref="PresentScore"/> can be performed by this screen.
        /// If <see langword="false"/>, <see cref="PresentScore"/> will have no effect.
        /// </summary>
        bool CanPresentScore { get; }

        /// <summary>
        /// Opens results screen with the given score.
        /// This assumes active beatmap and ruleset selection matches the score.
        /// </summary>
        void PresentScore(ScoreInfo score, ScorePresentType presentType = ScorePresentType.Results);

        /// <summary>
        /// Set the current filter text query to the provided string.
        /// </summary>
        void Search(string query);

        /// <summary>
        /// Gets relevant actionable items for beatmap context menus, based on the type of song select.
        /// </summary>
        IEnumerable<OsuMenuItem> GetForwardActions(BeatmapInfo beatmap);

        /// <summary>
        /// Temporarily bypasses filters and shows all difficulties of the given beatmapset.
        /// </summary>
        /// <param name="beatmapSet">The beatmapset.</param>
        void ScopeToBeatmapSet(BeatmapSetInfo beatmapSet);

        /// <summary>
        /// Removes the beatmapset scope and reverts the previously selected filters.
        /// </summary>
        void UnscopeBeatmapSet();

        /// <summary>
        /// Contains the currently scoped beatmapset. Used by external consumers for displaying its state.
        /// Cannot be used to change the value, any changes must be done through <see cref="ScopeToBeatmapSet"/>
        /// or <see cref="UnscopeBeatmapSet"/>.
        /// </summary>
        IBindable<BeatmapSetInfo?> ScopedBeatmapSet { get; }
    }
}
