using Quik.CommandMachine;
using Quik.Typography;

namespace Quik.Controls
{
    public class Button : Control
    {
        public string Text { get; set; } = "Button";
        public float Padding { get; set; } = 4.0f;

        // public QuikFont Font { get; set; }

        public QuikStrokeStyle NormalStroke { get; set; }
        public QuikFillStyle NormalFill { get; set; }
        public QuikStrokeStyle HoverStroke { get; set; }
        public QuikFillStyle HoverFill { get; set; }
        public QuikStrokeStyle ActiveStroke { get; set; }
        public QuikFillStyle ActiveFill { get; set; }

        private ButtonClass _class = ButtonClass.Normal;

        private enum ButtonClass
        {
            Normal,
            Hover,
            Active
        }


        protected override void OnMouseEnter(MouseMoveEventArgs args)
        {
            base.OnMouseEnter(args);

            if (_class == ButtonClass.Normal)
                _class = ButtonClass.Hover;
        }

        protected override void OnMouseLeave(MouseMoveEventArgs args)
        {
            base.OnMouseLeave(args);

            if (_class == ButtonClass.Hover)
                _class = ButtonClass.Normal;
        }

        protected override void OnMouseDown(MouseButtonEventArgs args)
        {
            base.OnMouseDown(args);

            if (_class == ButtonClass.Hover)
                _class = ButtonClass.Active;
        }

        protected override void OnMouseUp(MouseButtonEventArgs args)
        {
            base.OnMouseUp(args);

            if (_class == ButtonClass.Active)
            {
                _class = ButtonClass.Hover;
            }
        }

        protected override void OnPaint(CommandQueue draw)
        {
            QRectangle bounds = AbsoluteBounds;

            switch (_class)
            {
            default:
            case ButtonClass.Normal:
                draw.Rectangle(bounds);
                // draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
                //     StrokeStyle = NormalStroke,
                //     FillStyle = NormalFill
                // });
                break;
            // case ButtonClass.Hover:
            //     draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
            //         StrokeStyle = HoverStroke,
            //         FillStyle = HoverFill
            //     });
            //     break;
            // case ButtonClass.Active:
            //     draw.Commands.Enqueue(new QuikCommandRectangle(bounds) {
            //         StrokeStyle = ActiveStroke,
            //         FillStyle = ActiveFill
            //     });
            //     break;
            }

            // Position the text so that it is centered.
            // float ascender = Root.Context.DefaultFont.Ascender;
            // float descender = -Root.Context.DefaultFont.Descender;
            // QuikVec2 position =
            //     bounds.Min +
            //     new QuikVec2(
            //         Padding,
            //         (
            //             (bounds.Size.Y - ascender - descender) /
            //             2)
            //         + descender);

            // draw.PutText(Text, position);
        }
    }
}