﻿using UnityEngine;
using System.Collections;
// Couche Application du jeu
// Init: création des 10 cubes, à des positions aléatoires, dans la zone de jeu, à partir de Ocube
// Le jeu se termine si l'état de tous les cube est "En Zone de dépôt"
// Post: etatJeu de la Machine à Etats est "Fini"
public class ApplicationTP3scene2 : MonoBehaviour
{
    public enum EtatsJeuEnum { Init, EnCours, Fini };
    public EtatsJeuEnum etatJeu;
    public int MAX_NB_OBJECTS_TP3 = 10; // Nbre de cubes à générer
    private GameObject[] tblCubes;

    //--------------------------------------------
    // Création des objets à saisir
    // Pre: MAX_NB_OBJECTS_TP3 cubes à créer en instanciant Ocube
    void InitTP3()
    {
        GameObject Ocube = GameObject.Find("Ocube");
        tblCubes = new GameObject[MAX_NB_OBJECTS_TP3];
        Vector3 random_position;
        etatJeu = EtatsJeuEnum.Init;
        Debug.Log("[Init TP 3] " + MAX_NB_OBJECTS_TP3.ToString() + " objets vont être créés.");
        for (int i = 0; i < MAX_NB_OBJECTS_TP3; i++)
        {
            random_position.x = Mathf.Ceil(Random.Range(-6.0F, 6.0F));
            random_position.y = 0.0F;
            random_position.z = Mathf.Ceil(Random.Range(-6.0F, 6.0F));
            tblCubes[i] = Instantiate(Ocube) as GameObject;
            tblCubes[i].transform.position = random_position;
            tblCubes[i].gameObject.name = "Ocube_" + (i+1).ToString(); // On nomme le GameObject instancié Ocube<num_cube>
            tblCubes[i].SetActive(true); // On active le GameObject créé Ocube<num_cube>()
        }
        Ocube.SetActive(false); // On désactive le cube origine
    }

    //---------------------------------------------
    // Post: Nombre d'objets en zone de dépôt
    public int NbObjetsEnZoneDepot()
    {
        GameObject Cube_i;
        EtatCubeTP3 scriptEtatCubeTP3;
        string nom_cube_i;
        int nbCubein = 0;
        for (int i = 0; i < MAX_NB_OBJECTS_TP3; i++)
        {
            Cube_i = tblCubes[i];
            nom_cube_i = Cube_i.name;
            scriptEtatCubeTP3 = Cube_i.GetComponent<EtatCubeTP3>();
            if (scriptEtatCubeTP3.etatCube == EtatCubeTP3.EtatCubeEnum.EnZoneDépôt)
                nbCubein++;
        }
        return nbCubein;
    }

    //---------------------------------------------
    // Post: Premier GameObject sélectionnable le cas échéant, null sinon

    public GameObject CubeSelectionnable()
    {
        GameObject Cube_i;
        EtatCubeTP3 scriptEtatCube;
        string nom_cube_i;
        for (int i = 0; i < MAX_NB_OBJECTS_TP3; i++)
        {
            Cube_i = tblCubes[i];
            nom_cube_i = Cube_i.name;
            scriptEtatCube = Cube_i.GetComponent<EtatCubeTP3>();
            if (scriptEtatCube.etatCube == EtatCubeTP3.EtatCubeEnum.Sélectionnable)
                return Cube_i;
        }
        return null;
    }

    //---------------------------------------------
    // Post: Retourne true ssi les cubes sont tous dans la zone de dépôt
    public bool JeuTermine()
    {
        return (NbObjetsEnZoneDepot() == MAX_NB_OBJECTS_TP3);
    }

    //---------------------------------------------
    // Use this for initialization
    void Awake()
    {
        InitTP3();
    }

    //---------------------------------------------
    // Update is called once per frame
    void Update()
    {
        if (etatJeu == EtatsJeuEnum.Init)
        {
            etatJeu = EtatsJeuEnum.EnCours;
        }
        else if (etatJeu == EtatsJeuEnum.EnCours)
        {
            if (JeuTermine() == true)
            {
                Debug.Log("[Application TP3] Partie terminée en " + Time.time + " secondes");
                etatJeu = EtatsJeuEnum.Fini;
            }
        }
    }

    //---------------------------------------------
    public string StrEtatJeu()
    {
        string str = "Etat Jeu: ";

        if (etatJeu == EtatsJeuEnum.EnCours)
            str += "En cours ... " + NbObjetsEnZoneDepot().ToString() + "/" + MAX_NB_OBJECTS_TP3 + " cube";
        else if (etatJeu == EtatsJeuEnum.Init)
            str += "Init";
        else if (etatJeu == EtatsJeuEnum.Fini)
            str += "Fini";
        else
        {
            str += "*** INCONNU ***";
        }
        return str;
    }

    //---------------------------------------------
    public int IntEtatJeu()
    {
        int etat_jeu;

        if (etatJeu == EtatsJeuEnum.EnCours)
            etat_jeu = 1;
        else if (etatJeu == EtatsJeuEnum.Init)
            etat_jeu = 2;
        else if (etatJeu == EtatsJeuEnum.Fini)
            etat_jeu = 3;
        else
        {
            etat_jeu = -1;
        }
        return etat_jeu;
    }

  
}
