using System.Drawing;
using System.Drawing.Drawing2D;

namespace RyzStudio.Drawing
{
	public struct Rectangoid
	{
		private int X;
		private int Y;
		private int Width;
		private int Height;
		private int Radius;

		public Rectangoid(Rectangle rect, int radius)
		{
			X = rect.X;
			Y = rect.Y;
			Width = rect.Width;
			Height = rect.Height;
			Radius = radius;
		}

		public Rectangoid(Rectangle rect, int radius, int borderWidth)
		{
			rect.Inflate((-1 * borderWidth), (-1 * borderWidth));

			X = rect.X;
			Y = rect.Y;
			Width = rect.Width;
			Height = rect.Height;
			Radius = radius;
		}

		public Rectangoid(int x, int y, int width, int height, int radius)
		{
			X = x;
			Y = y;
			Width = width;
			Height = height;
			Radius = radius;
		}

		public Rectangoid(int x, int y, int width, int height)
		{
			X = x;
			Y = y;
			Width = width;
			Height = height;
			Radius = 0;
		}

		public Rectangoid(int width, int height, int radius)
		{
			X = 0;
			Y = 0;
			Width = width;
			Height = height;
			Radius = radius;
		}

		public Rectangoid(int width, int height)
		{
			X = 0;
			Y = 0;
			Width = width;
			Height = height;
			Radius = 0;
		}

		public Rectangoid(int width)
		{
			X = 0;
			Y = 0;
			Width = width;
			Height = width;
			Radius = 0;
		}

		public GraphicsPath ToGraphicsPath()
		{
			GraphicsPath rv = new GraphicsPath();
			rv.AddLine(X + this.Radius, Y, X + Width - (this.Radius * 2), Y);

			if (this.Radius > 0)
			{
				rv.AddArc(X + Width - (this.Radius * 2), Y, this.Radius * 2, this.Radius * 2, 270, 90);
			}

			rv.AddLine(X + Width, Y + this.Radius, X + Width, Y + Height - (this.Radius * 2));

			if (this.Radius > 0)
			{
				rv.AddArc(X + Width - (this.Radius * 2), Y + Height - (this.Radius * 2), this.Radius * 2, this.Radius * 2, 0, 90);
			}

			rv.AddLine(X + Width - (this.Radius * 2), Y + Height, X + this.Radius, Y + Height);

			if (this.Radius > 0)
			{
				rv.AddArc(X, Y + Height - (this.Radius * 2), this.Radius * 2, this.Radius * 2, 90, 90);
			}

			rv.AddLine(X, Y + Height - (this.Radius * 2), X, Y + this.Radius);

			if (this.Radius > 0)
			{
				rv.AddArc(X, Y, this.Radius * 2, this.Radius * 2, 180, 90);
			}

			rv.CloseFigure();

			return rv;
		}

		public PointF GetOrigin()
		{
			PointF rv = new PointF();
			rv.X = ((float)Width / 2) + X;
			rv.Y = ((float)Height / 2) + Y;

			return rv;
		}
	}
}