using UnityEngine;

//============================================================
//支持中文,文件使用UTF-8编码
//@author	JiphuTzu
//@create	20220910
//@company	Umawerse
//
//@description:
//============================================================
namespace Umawerse.FiniteStateMachines
{
    public class CircleDrawingState : DrawingState
    {
        private int _segments = 60;

        public CircleDrawingState(ToolsBootstrap root) : base(root, StateName.circle, 2, 2)
        {
        }

        protected override void OnTap(Vector3 pos)
        {
            AddPoint(pos);
        }

        protected override void OnDoubleTap(Vector3 pos)
        {
            //AddPoint(pos);
        }

        protected override void UpdatePreview(Vector3 pos)
        {
        }

        public override void Complete()
        {
            var filter = target.AddComponent<MeshFilter>();
            var renderer = target.AddComponent<MeshRenderer>();
            renderer.material = root.ployMaterial;
            renderer.material.color = Color.green;
            var radius = Vector3.Distance(vertices[0], vertices[1]);
            var mesh = CreateMesh(radius, _segments);
            filter.mesh = mesh;
            //
            var mc = target.AddComponent<MeshCollider>();

        }

        public override void AddPoint(Vector3 position, bool showImmediately = true)
        {
            vertices.Add(position);
            if (vertices.Count == 1)
                target.transform.position = position;
            if (!showImmediately) return;
            var circlePoint = Object.Instantiate(root.circlePointPrefab, target.transform);
            circlePoint.transform.position = position;
            if (vertices.Count == 2)
            {
                //var radius = Vector3.Distance(vertices[0], vertices[1]);
                //_currentMeshFilter.mesh = CreateMesh(radius, _segments);
                Complete();
            }
        }

        private Mesh CreateMesh(float radius, int segments)
        {
            //vertices:
            var verticesCount = segments + 1;
            var vertices = new Vector3[verticesCount];
            var uvs = new Vector2[verticesCount];
            vertices[0] = Vector3.zero;
            var radian = Mathf.PI * 2;
            var delta = radian / segments;

            for (var i = 1; i < verticesCount; i++)
            {
                var x = Mathf.Cos(radian);
                var y = Mathf.Sin(radian);

                vertices[i] = new Vector3(radius * x, 0, radius * y);
                uvs[i] = new Vector2(x / 2 + 0.5f, y / 2 + 0.5f);
                radian -= delta;
            }

            //triangles
            var triangleCount = segments * 3;
            var triangles = new int[triangleCount];
            for (int i = 0, vi = 1; i <= triangleCount - 1; i += 3, vi++) //因为该案例分割了60个三角形,故最后一个索引顺序应该是:0 60 1;所以需要单独处理
            {
                triangles[i] = 0;
                triangles[i + 1] = vi;
                triangles[i + 2] = vi + 1;
            }

            triangles[triangleCount - 3] = 0;
            triangles[triangleCount - 2] = verticesCount - 1;
            triangles[triangleCount - 1] = 1; //为了完成闭环,将最后一个三角形单独拎出来

            //负载属性与mesh
            var mesh = new Mesh
            {
                name = "Circle",
                vertices = vertices,
                triangles = triangles,
                uv = uvs
            };
            return mesh;
        }
    }
}