﻿using UnityEngine;
using System.Collections;

public class MachineAEtatsTP2scene5 : MonoBehaviour
{

    public MaterielScript Mat; // Couche Matérielle
    public NavigationScriptTP2scene2 NavigationI3DTechnique; // Couche I3D
    public SelectionScriptTP1 SelectionI3DTechnique; // Couche I3D, MVS
    public ManipulationScript ManipulationI3DTechnique; // Couche I3D
    public BougeBaseMobileScript gestionBaseMobile; // Gestion des objets de la scène Unity
    public gere_bras gestionBrasArticule; // Gestion des objets de la scène Unity
    public PrendObjetTP2scene4 gestionPince; // Gestion des objets de la scène Unity
    public EtatCubeTP2 cube;
    public GameObject cube_selectionnable;
    public GameObject cube_selectionne;
    //-------------------------------------------
    // 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()
    {
        if (cube.etatCube == EtatCubeTP2.EtatCubeEnum.Sélectionnable)
        {
            cube_selectionnable = cube.gameObject;
            cube_selectionne = null;
        }
        else if (cube.etatCube == EtatCubeTP2.EtatCubeEnum.Sélectionné)
        {
            cube_selectionne = cube.gameObject;
            cube_selectionnable = null;
        }
        else
        {
            cube_selectionne = null;
            cube_selectionnable = null;
        }

        if ((Mat.B2 == true) && (cube_selectionne != null))
        {
            Debug.Log(">>> Objet RELACHE");
            gestionPince.RelacheCube();
            cube_selectionne = cube.gameObject;
            Debug.Log(">>> Navigation 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)) // Transition Navigation vers Sélection
        {
            Debug.Log(">>> Navigation vers Sélection");
            etatVR = EtatsVR.Selection;
        }
        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";
        else if (etatVR == EtatsVR.Selection)
            str += "Sélection";
        else if (etatVR == EtatsVR.Manipulation)
            str += "Manipulation (" + 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;
    }

}
