﻿using UnityEngine;
using System.Collections;

public class MachineAEtatsTP3scene2 : MonoBehaviour
{
    public CameraScript gestionCamera; // Gestion des 3 caméras
    public MaterielScript Mat; // Couche Matérielle
    public NavigationScriptTP2scene2 NavigationI3DTechnique; // Couche I3D
    public SelectionScriptTP1 SelectionI3DTechnique; // Couche I3D
    public ManipulationScript ManipulationI3DTechnique; // Couche I3D
    public ApplicationTP3scene2 App; // Couche Application TP3 scene2 (gestion des 10 cubes de position aléatoire)
    public BougeBaseMobileScript gestionBaseMobile; // Gestion des objets de la scène Unity
    public gere_bras gestionBrasArticule; // Gestion des objets de la scène Unity
    public PrendObjetTP3scene2 gestionPince; // Gestion des objets physicalisés de la scène Unity
    private GameObject cube_selectionnable;
    private GameObject cube_selectionne;
    private string compteur_temps;
    //-------------------------------------------
    // Spécification des états du système de VR

    public enum EtatsVR { Selection, Manipulation, Navigation };
    public EtatsVR etatVR;

    //------------------------------------------
    // Initialisation de la machine à états du projet
    void Start()
    {
        etatVR = EtatsVR.Navigation;
        cube_selectionnable = null;
        cube_selectionne = null;
    }

    //------------------------------------------
    // Update is called once per frame
    void Update()
    {
        cube_selectionnable = App.CubeSelectionnable();
        cube_selectionne = gestionPince.cube_saisi;

        if (App.etatJeu == ApplicationTP3scene2.EtatsJeuEnum.Fini)
        {
            Debug.Log(">>> To TERMINATE"); // Scène 6
        }
        else if (Mat.B3 == true)
        {
            Debug.Log(">>> Camera SWITCH");
            gestionCamera.SwtichCameraActive();
            Debug.Log(">>> Camera active: " + gestionCamera.StrCameraActive());
        }
        else if ((Mat.B2 == true) && (cube_selectionne != null))
        {
            Debug.Log(">>> Objet RELACHE "+cube_selectionne.name);
            gestionPince.RelacheCube();
            cube_selectionne = null;
            if (etatVR == EtatsVR.Manipulation)
            {
                Debug.Log(">>> Manipulation vers Sélection ");
                etatVR = EtatsVR.Selection;
            }
        }
        else if ((Mat.B2 == true) && (etatVR == EtatsVR.Selection) && (cube_selectionnable != null))
        {
            Debug.Log(">>> Objet CAPTE");
            gestionPince.PrendCube(cube_selectionnable);
            cube_selectionne = cube_selectionnable;
            cube_selectionnable = null;
            etatVR = EtatsVR.Manipulation;
        }
        else if ((Mat.B1 == true) && (etatVR == EtatsVR.Navigation) && (cube_selectionne == null)) // Transition Navigation vers Sélection
        {
            Debug.Log(">>> Navigation vers Sélection");
            etatVR = EtatsVR.Selection;
        }
        else if ((Mat.B1 == true) && (etatVR == EtatsVR.Navigation) && (cube_selectionne != null)) // Transition Navigation vers Manipulation
        {
            Debug.Log(">>> Navigation vers Manipulation ("+cube_selectionne+")");
            etatVR = EtatsVR.Manipulation;
        }
        else if ((Mat.B1 == true) && (etatVR == EtatsVR.Selection)) // Transition Sélection vers Navigation
        {
            Debug.Log(">>> Sélection vers Navigation");
            etatVR = EtatsVR.Navigation;
        }
        else if ((Mat.B1 == true) && (etatVR == EtatsVR.Manipulation)) // Transition Manipulation vers Navigation
        {
            Debug.Log(">>> Manipulation vers Navigation");
            etatVR = EtatsVR.Navigation;
        }
        else if ((Mat.B1 == false) && (etatVR == EtatsVR.Navigation))
        {
            NavigationI3DTechnique.SetVRIncrement(); // On applique la technique de Navigation
            if (NavigationI3DTechnique.increment_trans_VR.magnitude > 0.0F | NavigationI3DTechnique.increment_rot_VR.magnitude > 0.0F)
            {
                gestionBaseMobile.increment_translation = NavigationI3DTechnique.increment_trans_VR;
                gestionBaseMobile.increment_rotation = NavigationI3DTechnique.increment_rot_VR;
                Debug.Log("[NAVIGATION] bouge base mobile.");
            }
        }
        else if ((Mat.B1 == false) && (Mat.B2 == false) && (etatVR == EtatsVR.Selection))
        {
            SelectionI3DTechnique.SetVRIncrement(); // On applique la technique de Sélection
            if (SelectionI3DTechnique.increment_VR.magnitude > 0)
            {
                gestionBrasArticule.increment = SelectionI3DTechnique.increment_VR;
                Debug.Log("[SELECTION] bouge bras.");
            }
        }
        else if ((Mat.B1 == false) && (Mat.B2 == false) && (etatVR == EtatsVR.Manipulation))
        {
            ManipulationI3DTechnique.SetVRIncrement(); // On applique la technique de Manipulation
            if (ManipulationI3DTechnique.increment_VR.magnitude > 0)
            {
                gestionBrasArticule.increment = ManipulationI3DTechnique.increment_VR;
                Debug.Log("[MANIPULATION] bouge bras.");
            }
        }
        else
        {

        }
    }

    //------------------------------------------

    public string StrEtatVR()
    {
        string str = "";

        if (etatVR == EtatsVR.Navigation)
        {
            str += "Navigation";
            if (cube_selectionne != null)
                str += " (" + cube_selectionne.name + ")";
        }
        else if (etatVR == EtatsVR.Selection)
            str += "Sélection";
        else if (etatVR == EtatsVR.Manipulation)
        {
            str += "Manipulation";
            if (cube_selectionne != null)
                str += " (" + cube_selectionne.name + ")";
        }
        else
        {
            str += "*** INCONNU ***";
        }

        return str;
    }

    //------------------------------------------
    public int IntEtatVR()
    {
        int etat_vr;

        if (etatVR == EtatsVR.Navigation)
            etat_vr = 1;
        else if (etatVR == EtatsVR.Selection)
            etat_vr = 2;
        else if (etatVR == EtatsVR.Manipulation)
            etat_vr = 3;
        else
        {
            etat_vr = -1;
        }

        return etat_vr;
    }

    //------------------------------------------
    // Post: -1 si le cube n'est pas sélectionnable
    //       1 si le cube est sélectionnable
    public int IntObjetSelectionnable()
    {
        if (cube_selectionnable != null)
            return 1;

        return -1;
    }

    //------------------------------------------
    // Post: -1 si le cube n'est pas sélectionné
    //       1 si le cube est sélectionné
    public int IntObjetSelectionne()
    {
        if (cube_selectionne != null)
            return 1;

        return -1;
    }

    //--------------------------------------------
    void OnGUI() // TP3 scène 1
    {
        GUI.contentColor = Color.red;
        if (App.etatJeu == ApplicationTP3scene2.EtatsJeuEnum.EnCours)
        {
            compteur_temps = Time.time.ToString("0.") + " sec";
            string mode = "Mode: " + StrEtatVR();
            string camera_active = "Caméra active: " + gestionCamera.StrCameraActive();

            string nb_objets_deposes = App.NbObjetsEnZoneDepot().ToString() + "/" + App.MAX_NB_OBJECTS_TP3.ToString();

            GUI.Label(new Rect(10, 5, 150, 20), compteur_temps);
            GUI.Label(new Rect(10, 25, 300, 20), mode);
            GUI.Label(new Rect(10, 45, 100, 20), "Dépose: " + nb_objets_deposes);
            GUI.Label(new Rect(10, 65, 300, 20), camera_active);
        }
        else if (App.etatJeu == ApplicationTP3scene2.EtatsJeuEnum.Fini)
        {
            string mode = "Mode: " + StrEtatVR();
            string camera_active = "Caméra active: " + gestionCamera.StrCameraActive();
            string nb_objets_deposes = App.NbObjetsEnZoneDepot().ToString() + "/" + App.MAX_NB_OBJECTS_TP3.ToString();

            GUI.Label(new Rect(10, 5, 150, 20), "Jeu achevé en " + compteur_temps);
            GUI.Label(new Rect(10, 25, 300, 20), mode);
            GUI.Label(new Rect(10, 45, 100, 20), "Dépose: "+nb_objets_deposes);
            GUI.Label(new Rect(10, 65, 300, 20), camera_active);
        }
    }

}
