// 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.Audio.Track;
using osu.Framework.Graphics.Textures;
using osu.Framework.Graphics.Video;
using osu.Game.Beatmaps;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Rulesets.Objects;
using osu.Game.Skinning;
using osu.Game.Storyboards;

namespace osu.Game.Screens.Edit
{
    /// <summary>
    /// Encapsulates a <see cref="WorkingBeatmap"/> while providing an overridden <see cref="Beatmap{TObject}"/>.
    /// </summary>
    /// <typeparam name="TObject"></typeparam>
    public class EditorWorkingBeatmap<TObject> : IWorkingBeatmap
        where TObject : HitObject
    {
        private readonly Beatmap<TObject> playableBeatmap;
        private readonly WorkingBeatmap workingBeatmap;

        public EditorWorkingBeatmap(Beatmap<TObject> playableBeatmap, WorkingBeatmap workingBeatmap)
        {
            this.playableBeatmap = playableBeatmap;
            this.workingBeatmap = workingBeatmap;
        }

        public IBeatmap Beatmap => workingBeatmap.Beatmap;

        public Texture Background => workingBeatmap.Background;

        public VideoSprite Video => workingBeatmap.Video;

        public Track Track => workingBeatmap.Track;

        public Waveform Waveform => workingBeatmap.Waveform;

        public Storyboard Storyboard => workingBeatmap.Storyboard;

        public ISkin Skin => workingBeatmap.Skin;

        public IBeatmap GetPlayableBeatmap(RulesetInfo ruleset, IReadOnlyList<Mod> mods) => playableBeatmap;
    }
}