using System;

namespace Ooui
{
    public class Canvas : Element
    {
        CanvasRenderingContext2D context2d = new CanvasRenderingContext2D ();
        int gotContext2d = 0;

        public int Width {
            get => GetAttribute ("width", 300);
            set => SetAttributeProperty ("width", value < 0 ? 0 : value);
        }

        public int Height {
            get => GetAttribute ("height", 150);
            set => SetAttributeProperty ("height", value < 0 ? 0 : value);
        }

        public Canvas ()
            : base ("canvas")
        {
            context2d.MessageSent += Send;
        }

        public CanvasRenderingContext2D GetContext2D ()
        {
            if (System.Threading.Interlocked.CompareExchange (ref gotContext2d, 1, 0) == 0) {
                var mcall = Message.Call (Id, "getContext", "2d");
                mcall.ResultId = context2d.Id;
                Send (mcall);
            }
            return context2d;
        }
        protected override bool SaveStateMessageIfNeeded (Message message)
        {
            if (message.TargetId == Id) {
                switch (message.MessageType) {
                    case MessageType.Call:
                        if (message.Key == "getContext" && message.Value is Array a && a.Length == 1 && "2d".Equals (a.GetValue (0))) {
                            AddStateMessage (message);
                        }
                        break;
                }
            }
            return base.SaveStateMessageIfNeeded (message);
        }
    }
}
