// 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;
using osu.Framework.Graphics.Containers;

namespace osu.Game.Screens.Ranking
{
    /// <summary>
    /// A <see cref="CompositeDrawable"/> which tracks the size of a <see cref="ScorePanel"/>, to which the <see cref="ScorePanel"/> can be added or removed.
    /// </summary>
    public class ScorePanelTrackingContainer : CompositeDrawable
    {
        /// <summary>
        /// The <see cref="ScorePanel"/> that created this <see cref="ScorePanelTrackingContainer"/>.
        /// </summary>
        public readonly ScorePanel Panel;

        internal ScorePanelTrackingContainer(ScorePanel panel)
        {
            Panel = panel;
            Attach();
        }

        /// <summary>
        /// Detaches the <see cref="ScorePanel"/> from this <see cref="ScorePanelTrackingContainer"/>, removing it as a child.
        /// This <see cref="ScorePanelTrackingContainer"/> will continue tracking any size changes.
        /// </summary>
        /// <exception cref="InvalidOperationException">If the <see cref="ScorePanel"/> is already detached.</exception>
        public void Detach()
        {
            if (InternalChildren.Count == 0)
                throw new InvalidOperationException("Score panel container is not attached.");

            RemoveInternal(Panel);
        }

        /// <summary>
        /// Attaches the <see cref="ScorePanel"/> to this <see cref="ScorePanelTrackingContainer"/>, adding it as a child.
        /// </summary>
        /// <exception cref="InvalidOperationException">If the <see cref="ScorePanel"/> is already attached.</exception>
        public void Attach()
        {
            if (InternalChildren.Count > 0)
                throw new InvalidOperationException("Score panel container is already attached.");

            AddInternal(Panel);
        }
    }
}