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

[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
public class MergeMesh : MonoBehaviour {

	//private bool DoOnce = false;
	private GameObject SubMesh;
	private GameObject[] ChildList;
	private Mesh BlankMesh;
	private Matrix4x4 ParentMatrix;
	private bool Cleanup = false;

	 void ManualBatch(){
		//if (DoOnce == false) {
		//	DoOnce = true;
		ParentMatrix = this.transform.worldToLocalMatrix;

		this.GetComponent<MeshRenderer> ().enabled = true;
		this.GetComponent<MeshFilter> ().mesh = BlankMesh;
		MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter> ();
		ChildList = new GameObject[meshFilters.Length];
		CombineInstance[] combine = new CombineInstance[meshFilters.Length];
		int i = 0;
		while (i < meshFilters.Length) {
			combine [i].mesh = meshFilters [i].sharedMesh;
			combine [i].transform = ParentMatrix * meshFilters [i].transform.localToWorldMatrix;
			ChildList [i] = meshFilters [i].gameObject;
				meshFilters [i].gameObject.SetActive (false);
				;
				i++;
			}
		transform.GetComponent<MeshFilter> ().mesh = BlankMesh;
		transform.GetComponent<MeshFilter> ().mesh.CombineMeshes (combine);
		transform.gameObject.SetActive (true);
		SubMesh = transform.gameObject;
	//	}
	}

	void ToggleVisible(){
		int i = 0;
		//MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter> ();
		while (i < ChildList.Length) {
			//this.gameObject.SetActive (true);
			if (ChildList [i].gameObject != null) {
				ChildList [i].gameObject.SetActive (true);
				//ChildList [i].gameObject.GetComponent<Rigidbody> ().IsSleeping ()
				i += 1;
			} else {
				return;
			}
		}
		this.GetComponent<MeshRenderer> ().enabled = false;
	}

	bool CheckIfMostAreSleeping(){
		float tempSleepCount =0;
		float ObjectCount =0;
		int i = 0;
		while (i < ChildList.Length) {
			if (ChildList [i].gameObject != null) {
				ObjectCount += 1;
				if (ChildList [i].gameObject.GetComponent<Rigidbody> () != null && ChildList [i].gameObject.GetComponent<Rigidbody> ().IsSleeping () == true) {
					tempSleepCount += 1;
				}
			}
			i += 1;
		}
		tempSleepCount = ((tempSleepCount / ObjectCount) * 100);
		if (tempSleepCount > 70) {
			//print (ObjectCount);
			//print (tempSleepCount);
			return true;
		} else {
			//print (ObjectCount);
			//print (tempSleepCount);
			return false;
		}
	}


	void OnTriggerEnter(Collider TheContact){
		if (TheContact.gameObject.CompareTag ("Player") && this.GetComponent<MeshRenderer> ().enabled == true) {
			ToggleVisible ();
		}
		if (TheContact.gameObject.CompareTag ("Bullet") && this.GetComponent<MeshRenderer> ().enabled == true) {
			ToggleVisible ();
		}
	}

	void OnTriggerExit(Collider TheContact){
		if (CheckIfMostAreSleeping () == true && this.GetComponent<MeshRenderer> ().enabled == false) {
			ManualBatch ();
			Cleanup = false; //No need to check if it's done
		} else {
			Cleanup = true;//Need to check if it's done
		}
	}

	void Start(){
		ManualBatch ();
	}
	void Update(){
		if (Input.GetAxis ("Jump") == 1 && this.GetComponent<MeshRenderer> ().enabled == false) {
				ManualBatch ();
		}
		//Disable the physics
		if (Cleanup == true && CheckIfMostAreSleeping () == true && this.GetComponent<MeshRenderer> ().enabled == false) {
			ManualBatch ();
		}
	}


}
