using Io.Github.Kerwinxu.LibShapes.Utils;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;

namespace Io.Github.Kerwinxu.LibShapes.Core.State
{

    
    public class StateSelected:State
    {
        public StateSelected(UserControlCanvas canvas, PointF start_pointF) : base(canvas, start_pointF)
        {

        }
        public StateSelected(UserControlCanvas canvas) : base(canvas)
        {

        }

        public override void LeftMouseDown(PointF pointF)
        {
            // 首先判断一下是否在这个选择矩形的范围内
            // 在的话就是更改模式了，比如更改尺寸和移动。我这个在选择框上是更改尺寸，而在内部是移动
            // 如果不在，就转成待机模式
            // 1. 这里判断一下是否在矩形框的范围内
            GraphicsPath path = new GraphicsPath();
            // 这里要判断一下是否是ShapeMultiSelect
            if (this.canvas.SelectShape is Shape.ShapeMultiSelect)
            {
                // 那么最简单的方式是取消所有的选择，然后运行待机模式的选择
                this.canvas.changeSelect(null);
                this.canvas.state = new StateStandby(this.canvas);
                this.canvas.state.LeftMouseDown(pointF);
            }
            else
            {
                // 如果选择的图形是其他类型
                // 看看是否被选择了吧。
                var rect = this.canvas.SelectShape.GetBounds(this.canvas.shapes.GetMatrix());
                // 放大范围，
                // 这里根据宽度和高度的情况酌情放大范围
                float select_tolerance = 1;
                if (rect.Width < 4 || rect.Height < 4) select_tolerance = Math.Min(rect.Height, rect.Width) / 4;

                rect.X -= select_tolerance;
                rect.Y -= select_tolerance;
                rect.Width += select_tolerance * 2;
                rect.Height += select_tolerance * 2;
                path.AddRectangle(rect);
                // 判断是否
                if (path.IsVisible(pointF))
                {
                    this.canvas.state = new StateChanging(this.canvas, pointF);
                    this.canvas.state.LeftMouseDown(pointF);
                }
                else
                {
                    // 转成待机模式
                    this.canvas.changeSelect(null);
                    this.canvas.state = new StateStandby(this.canvas);
                    this.canvas.state.LeftMouseDown(pointF);
                }
            }


            //base.LeftMouseDown(pointF);
        }
    }
}
