using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using PckStudio.Core.Skin;

namespace PckStudio.Core.Extensions
{
    public static class SkinBOXExtensions
    {
        public static GraphicsPath GetUVGraphicsPath(this SkinBOX skinBOX, Vector2 tillingFactor)
        {
            var types = new byte[9];
            var points = new PointF[9];

            var path = new GraphicsPath(FillMode.Winding);

            Vector2 uv = skinBOX.UV;
            Vector3 size = skinBOX.Size;

            path.AddRectangle(new RectangleF(new PointF((uv.X                      ) * tillingFactor.X, (uv.Y + size.Z) * tillingFactor.Y), new SizeF(size.Z * tillingFactor.X, size.Y * tillingFactor.Y)));
            path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z             ) * tillingFactor.X, (uv.Y + size.Z) * tillingFactor.Y), new SizeF(size.X * tillingFactor.X, size.Y * tillingFactor.Y)));
            path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z + size.X    ) * tillingFactor.X, (uv.Y + size.Z) * tillingFactor.Y), new SizeF(size.Z * tillingFactor.X, size.Y * tillingFactor.Y)));
            path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z * 2 + size.X) * tillingFactor.X, (uv.Y + size.Z) * tillingFactor.Y), new SizeF(size.X * tillingFactor.X, size.Y * tillingFactor.Y)));
            
            path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z             ) * tillingFactor.X, (uv.Y         ) * tillingFactor.Y), new SizeF(size.X * tillingFactor.X, size.Z * tillingFactor.Y)));
            path.AddRectangle(new RectangleF(new PointF((uv.X + size.Z + size.X    ) * tillingFactor.X, (uv.Y         ) * tillingFactor.Y), new SizeF(size.X * tillingFactor.X, size.Z * tillingFactor.Y)));

            return path;
        }

        public static GraphicsPath GetUVGraphicsPath(this SkinBOX skinBox)
        {
            return skinBox.GetUVGraphicsPath(Vector2.One);
        }

        public static string GetOverlayType(this SkinBOX skinBox)
        {
            if (!skinBox.IsValidType())
                return "";
            if (skinBox.IsOverlayPart())
                return skinBox.Type;
            int index = Array.IndexOf(SkinBOX.BaseTypes, skinBox.Type);
            return SkinBOX.OverlayTypes.IndexInRange(index) ? SkinBOX.OverlayTypes[index] : "";
        }

        public static string GetOverlayType(string type)
        {
            if (!SkinBOX.IsValidType(type))
                return "";
            if (SkinBOX.IsOverlayPart(type))
                return type;
            int index = Array.IndexOf(SkinBOX.BaseTypes, type);
            return SkinBOX.OverlayTypes.IndexInRange(index) ? SkinBOX.OverlayTypes[index] : "";
        }

        public static string GetBaseType(this SkinBOX skinBox)
        {
            if (!skinBox.IsValidType())
                return "";
            if (skinBox.IsBasePart())
                return skinBox.Type;
            int index = Array.IndexOf(SkinBOX.OverlayTypes, skinBox.Type);
            return SkinBOX.BaseTypes.IndexInRange(index) ? SkinBOX.BaseTypes[index] : "";
        }

        public static string GetBaseType(string type)
        {
            if (!SkinBOX.IsValidType(type))
                return "";
            if (SkinBOX.IsBasePart(type))
                return type;
            int index = Array.IndexOf(SkinBOX.OverlayTypes, type);
            return SkinBOX.BaseTypes.IndexInRange(index) ? SkinBOX.BaseTypes[index] : "";
        }
    }
}
