using UnityEngine;

[RequireComponent(typeof(PolygonCollider2D))]
public class PolygonColliderVisualizer : MonoBehaviour
{
    public Color fillColor = new Color(1, 0, 0, 0.5f); // Цвет заливки (полупрозрачный красный)
    public Color outlineColor = Color.red; // Цвет контура

    private PolygonCollider2D polygonCollider;
    private MeshFilter meshFilter;
    private MeshRenderer meshRenderer;

    void Awake()
    {
        // Получаем PolygonCollider2D
        polygonCollider = GetComponent<PolygonCollider2D>();

        // Создаем необходимые компоненты для визуализации
        meshFilter = gameObject.AddComponent<MeshFilter>();
        meshRenderer = gameObject.AddComponent<MeshRenderer>();
        meshRenderer.material = new Material(Shader.Find("Sprites/Default"));
        meshRenderer.material.color = fillColor;

        UpdateMesh();
    }

    void UpdateMesh()
    {
        if (polygonCollider == null || meshFilter == null)
            return;

        // Получаем точки из PolygonCollider2D
        Vector2[] points = polygonCollider.points;

        // Создаем массив вершин и треугольников для Mesh
        Vector3[] vertices = new Vector3[points.Length];
        for (int i = 0; i < points.Length; i++)
        {
            vertices[i] = points[i]; // Локальные координаты в Vector3
        }

        // Триангуляция многоугольника
        int[] triangles = Triangulate(points);

        // Создаем Mesh
        Mesh mesh = new Mesh();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        // Устанавливаем Mesh в MeshFilter
        meshFilter.mesh = mesh;
    }

    int[] Triangulate(Vector2[] points)
    {
        // Простой алгоритм триангуляции (работает только для выпуклых полигонов)
        int n = points.Length;
        if (n < 3) return new int[0];

        int[] triangles = new int[(n - 2) * 3];
        for (int i = 0; i < n - 2; i++)
        {
            triangles[i * 3] = 0;
            triangles[i * 3 + 1] = i + 1;
            triangles[i * 3 + 2] = i + 2;
        }

        return triangles;
    }

    private void OnValidate()
    {
        UpdateMesh();
    }

    private void OnDrawGizmos()
    {
        if (polygonCollider == null) return;

        Gizmos.color = outlineColor;
        Vector2[] points = polygonCollider.points;
        for (int i = 0; i < points.Length; i++)
        {
            Vector3 worldPointA = transform.TransformPoint(points[i]);
            Vector3 worldPointB = transform.TransformPoint(points[(i + 1) % points.Length]);
            Gizmos.DrawLine(worldPointA, worldPointB);
        }
    }
}
