using System;
using System.Collections.Generic;
using System.Linq;

namespace Unity.VisualScripting
{
    public sealed class Sidebars
    {
        public Sidebars()
        {
            left = new Sidebar(this, SidebarAnchor.Left);
            right = new Sidebar(this, SidebarAnchor.Right);
        }

        [Serialize]
        public Sidebar left { get; private set; }

        [Serialize]
        public Sidebar right { get; private set; }

        [Serialize]
        public List<SidebarPanel> panels { get; private set; } = new List<SidebarPanel>();

        [DoNotSerialize]
        public Sidebar this[SidebarAnchor anchor]
        {
            get
            {
                switch (anchor)
                {
                    case SidebarAnchor.Left: return left;
                    case SidebarAnchor.Right: return right;
                    default: throw new UnexpectedEnumValueException<SidebarAnchor>(anchor);
                }
            }
        }

        public void Feed(IEnumerable<ISidebarPanelContent> panelContents)
        {
            Ensure.That(nameof(panelContents)).IsNotNull(panelContents);

            foreach (var panel in panels)
            {
                panel.Disable();
            }

            foreach (var panelContent in panelContents)
            {
                Feed(panelContent);
            }
        }

        public void Feed(ISidebarPanelContent panelContent)
        {
            var associated = panels.Any(panel => panel.TryAssociate(panelContent));

            if (!associated)
            {
                panels.Add(new SidebarPanel(panelContent));
            }

            foreach (var panel in panels)
            {
                panel.sidebars = this;
            }
        }

        public void Remove<T>() where T : ISidebarPanelContent
        {
            left.Remove<T>();
            right.Remove<T>();
        }
    }
}