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

public class LevelControl : MonoBehaviour {

    [Range(1,10)]
    public int players;
    [Range(5,73)]
    public int trees;
    private CameraControl cam;

    public GameObject terrain;
    [Range(0.01f,1)]
    public float animationSpeed;

    private List<Transform> castlePositions = new List<Transform>();
    private const string castleName = "castle";
    public float castleOffsetY;

    private List<Transform> treePositions = new List<Transform>();
    private const string treeName = "tree";
    public float treeeOffsetY;

    public GameObject castle;
    public GameObject tree;

    private int steps;
    private bool breakAnimation;

    // Use this for initialization
    void Start () {
        initialize();
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.Return) || Input.GetButtonDown("Fire1")) {
            steps++;
            switch (steps) {
                case 1:
                    startTrees();
                    break;
                case 2:
                    startCastle();
                    break;
                case 3:
                    startGame();
                    break;
            }
        }
    }

    void initialize() {
        cam = Camera.main.GetComponent<CameraControl>();
        cam.setPlayersCount(players);
        cam.setTreesCount(trees);

        if (terrain)
        {
            int count = terrain.transform.childCount;
            for (int i = 0; i < count; i++) {
                Transform child = terrain.transform.GetChild(i);
                if (child.name.Substring(0, castleName.Length).Equals(castleName))
                {
                    castlePositions.Add(child);
                }
                else if (child.name.Substring(0, treeName.Length).Equals(treeName)) {
                    treePositions.Add(child);
                }
            }
        }
        else {
            Debug.LogError("nie je priradeny teren");
            
            #if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
            #endif
        }
    }
    
    void startTrees()
    {
        for (int i = 0; i < trees; i++)
        {
            Vector3 pos = treePositions[i].position;
            pos.y += treeeOffsetY;
            Quaternion rot = treePositions[i].rotation;
            rot.eulerAngles = new Vector3(rot.eulerAngles.x, Random.Range(0, 360), rot.eulerAngles.z);
            StartCoroutine(animePositionGameObject(Instantiate(tree, pos, rot),treePositions[i].position));
        }
        Destroy(tree);
    }
    void startCastle()
    {
        for (int i = 0; i < players; i++)
        {
            Vector3 pos = castlePositions[i].position;
            pos.y += castleOffsetY;
            StartCoroutine(animePositionGameObject(Instantiate(castle, pos, castlePositions[i].rotation), castlePositions[i].position));
        }
        Destroy(castle);
    }

    IEnumerator animePositionGameObject(GameObject gameObject,Vector3 endPosition) {
        Vector3 vel = Vector3.zero;

        while (gameObject.transform.position.y > endPosition.y+0.1 && !breakAnimation) {
            gameObject.transform.position = Vector3.SmoothDamp(gameObject.transform.position, endPosition, ref vel, animationSpeed);
            yield return new WaitForEndOfFrame();
        }

        gameObject.transform.position = endPosition;

        yield return new WaitForEndOfFrame();

        Rigidbody[] rgb = gameObject.GetComponentsInChildren<Rigidbody>();
        foreach (Rigidbody r in rgb) {
            r.isKinematic = false;
        }
        
    }


    void startGame() {
        breakAnimation = true;
        StartCoroutine(play());
    }

    IEnumerator play()
    {
        yield return new WaitForEndOfFrame();
        yield return new WaitForEndOfFrame();

        GetComponent<PlayerControl>().enabled = true;
        Camera.main.GetComponent<CameraControl>().enabled = true;
        enabled = false;

    }

}
