namespace Unity.VisualScripting
{
    public class CanvasProvider : SingleDecoratorProvider<IGraph, ICanvas, CanvasAttribute>
    {
        static CanvasProvider()
        {
            instance = new CanvasProvider();
        }

        public static CanvasProvider instance { get; }

        protected override bool cache => true;

        public override bool IsValid(IGraph graph)
        {
            return true;
        }
    }

    public static class XCanvasProvider
    {
        public static ICanvas Canvas(this IGraph graph)
        {
            return CanvasProvider.instance.GetDecorator(graph);
        }

        public static TCanvas Canvas<TCanvas>(this IGraph graph) where TCanvas : ICanvas
        {
            return CanvasProvider.instance.GetDecorator<TCanvas>(graph);
        }

        public static IWidget Widget(this ICanvas context, IGraphItem item)
        {
            return context.widgetProvider.GetDecorator(item);
        }

        public static TWidget Widget<TWidget>(this ICanvas context, IGraphItem item) where TWidget : IWidget
        {
            return context.widgetProvider.GetDecorator<TWidget>(item);
        }

        public static IGraphElementWidget Widget(this ICanvas context, IGraphElement element)
        {
            return (IGraphElementWidget)context.widgetProvider.GetDecorator(element);
        }

        public static TWidget Widget<TWidget>(this ICanvas context, IGraphElement element) where TWidget : IGraphElementWidget
        {
            return context.widgetProvider.GetDecorator<TWidget>(element);
        }
    }
}