using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using JumpTower;

namespace JumpTower
{
    public class MeshData
    {
        private List<int> partTriangles;
        private List<Part> parts;

        public MeshData()
        {
            Reset();
        }
        private void Reset()
        {
            partTriangles = new List<int>();
            if (partTriangles != null) partTriangles.Clear();
            parts = new List<Part>();
            if (partTriangles != null) parts.Clear();

        }
        public void AddPart() => parts.Add(new Part());

        public int AddVertex(Vector3 position, Vector2 uv, Vector3 normal) { return parts[parts.Count - 1].AddVertex(position, uv, normal); }

        public int AddTriangle(int v0, int v1, int v2) { return parts[parts.Count - 1].AddTriangle(v0, v1, v2); }


        public Mesh[] CreatMesh()
        {
            List<Mesh> mesh = new List<Mesh>();
            if (mesh != null) mesh.Clear();
            if (partTriangles != null) partTriangles.Clear();
            int i = 0;
            foreach (var part in parts)
            {
                if (partTriangles != null) partTriangles.Clear();
                mesh.Add(new Mesh());
                mesh[i].vertices = part.vertices.ToArray();
                mesh[i].uv = part.uvs.ToArray();
                mesh[i].normals = part.normals.ToArray();
                foreach (var triangle in part.triangles)
                {
                    partTriangles.Add(triangle.vertices[0]);
                    partTriangles.Add(triangle.vertices[1]);
                    partTriangles.Add(triangle.vertices[2]);
                }
                mesh[i].triangles = partTriangles.ToArray();
                i++;
            }
            return mesh.ToArray();
        }

    }

    public class Triangle
    {
        public int[] vertices { get; private set; }
        public Triangle(int v0, int v1, int v2)
        {
            vertices = new int[3];
            vertices[0] = v0;
            vertices[1] = v1;
            vertices[2] = v2;
        }
    }

    public class Part
    {
        public List<Vector3> vertices { get; private set; }
        public List<Vector2> uvs { get; private set; }
        public List<Vector3> normals { get; private set; } 
        public List<Triangle> triangles { get; private set; }
        public Part()
        {
            Reset();
        }

        public int AddVertex(Vector3 position, Vector2 uv, Vector3 normal)
        {
            vertices.Add(position);
            uvs.Add(uv);
            normals.Add(normal);
            return vertices.Count;
        }

        public int AddTriangle(int v0, int v1, int v2)
        {
            triangles.Add(new Triangle(v0, v1, v2));
            return triangles.Count - 1;
        }

        private void Reset()
        {
            vertices = new List<Vector3>();
                if (vertices != null) vertices.Clear();
            triangles = new List<Triangle>();
                if (triangles != null) triangles.Clear();
            uvs = new List<Vector2>();
                if (uvs != null) uvs.Clear();
            normals = new List<Vector3>();
                if (uvs != null) normals.Clear();

        }
    }
}
