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


using JumpTower;

namespace JumpTower
{
    public class MeshCreator : MonoBehaviour
    {
        // Start is called before the first frame update

        [Range(3, 50), SerializeField] private int numside;
        [Min(0.1f), SerializeField] private float length;
        [Min(0.1f), SerializeField] private float radius;
        [SerializeField] private Material MaterialBounce;
        [SerializeField] private Material MaterialSlow;
        [SerializeField] private Material MaterialFlash;
        [SerializeField] private Material MaterialBreak;
        [SerializeField] private Material MaterialDeath;
        [SerializeField] private GameObject cylender;
        [SerializeField] private GameObject newObstacle;
        [SerializeField] internal int cylenderIndex;


        private CylinderData cylinderData;
        private bool _isAnyBreak;
        private Mesh[] mesh;



        void Start()
        {
            ParentCreator();

        }


        private void ParentCreator()
        {
            cylinderData = new CylinderData(numside, length, radius);
            GameObject parent = new GameObject("Parent");

            if (cylinderData != null)
            {
                cylinderData.Generate();
                mesh = cylinderData.mesh;
                _isAnyBreak = false;
                foreach (var m in mesh)
                {
                    if (m == mesh[mesh.Length - 1])
                    {
                        GameObjectCreator(m, parent, true);
                    }
                    else
                    {
                        GameObjectCreator(m, parent, false);
                    }
                }
            }
            parent.transform.parent = cylender.transform;
            parent.transform.localPosition = Vector3.zero;

        }

        private void GameObjectCreator(Mesh mesh, GameObject parent, bool _isLast)
        {
            // Quick check: if mesh is null or has no valid triangles, skip collider (or skip creation).
            if (mesh == null || mesh.vertexCount < 3 || mesh.triangles.Length < 3)
            {
                Debug.LogWarning("Skipping degenerate/empty mesh  no valid triangles!");
                return; // optional: or just skip the collider, see below
            }

            int partType;
            if (cylenderIndex == 1)
                partType = Random.Range(0, 9);
            else if (cylenderIndex == 2)
                partType = Random.Range(0, 10);
            else if (cylenderIndex == 3)
                partType = Random.Range(0, 11);
            else
                partType = Random.Range(0, 12);

            newObstacle = new GameObject("Mesh",
                typeof(MeshFilter),
                typeof(MeshRenderer),
                typeof(MeshCollider),
                typeof(Rigidbody)
            );
            newObstacle.transform.localScale = Vector3.one;

            // Assign mesh
            var mf = newObstacle.GetComponent<MeshFilter>();
            mf.sharedMesh = mesh;

            // Optional: Recalculate normals and bounds here if needed:
            // mesh.RecalculateNormals();
            // mesh.RecalculateBounds();

            var mc = newObstacle.GetComponent<MeshCollider>();
            mc.sharedMesh = mesh;
            mc.convex = true;

            // Setup Rigidbody
            var rb = newObstacle.GetComponent<Rigidbody>();
            rb.useGravity = false;
            rb.isKinematic = true;

            // Choose the material/tag
            if (partType < 7 && (!_isLast || _isAnyBreak))
            {
                newObstacle.tag = "Bounce";
                newObstacle.GetComponent<MeshRenderer>().material = MaterialBounce;
            }
            else if (partType < 9 || (_isLast && !_isAnyBreak))
            {
                _isAnyBreak = true;
                newObstacle.tag = "Break";
                newObstacle.GetComponent<MeshRenderer>().material = MaterialBreak;
            }
            else if (partType < 10 && (!_isLast || _isAnyBreak))
            {
                newObstacle.tag = "Slow";
                newObstacle.GetComponent<MeshRenderer>().material = MaterialSlow;
            }
            else if (partType < 11 && (!_isLast || _isAnyBreak))
            {
                newObstacle.tag = "Flash";
                newObstacle.GetComponent<MeshRenderer>().material = MaterialFlash;
            }
            else
            {
                newObstacle.tag = "Death";
                newObstacle.GetComponent<MeshRenderer>().material = MaterialDeath;
            }

            newObstacle.transform.parent = parent.transform;
        }

    }
}
