﻿using UnityEngine;
using System.Collections;

// Cette classe est déposée sur l'EmptyObject Otool
// Prend en compte les cubes physicalisés
// En particulier, isKinematic du composant RigidBody du cube est mis à 1 lorsque le cube est pris par la pince (pour qu'il suive le mouvement de la mpince) et est remis à 0 lorsque le cube est lâché par la pince
public class PrendObjetTP3scene2 : MonoBehaviour {
    public enum EtatsPince { Ouverte, Fermee };
    public EtatsPince etatPince;
    private GameObject Opince_g;
    private GameObject Opince_d;
    public GameObject ancien_parent;
    public GameObject cube_saisi;

    //-------------------------------------
	// Init pince
    // La pince est ouverte
	void Start () {
        Opince_g = GameObject.Find("Opince_g").gameObject;
        Opince_d = GameObject.Find("Opince_d").gameObject;
        // Pince ouverte à l'Init
        Opince_g.transform.localPosition = new Vector3(-0.034F, 0.0F, 0.0F);
        Opince_d.transform.localPosition = new Vector3(0.034F, 0.0F, 0.0F);
        etatPince = EtatsPince.Ouverte;
        cube_saisi = null;
    }

    //-------------------------------------
	// Update is called once per frame
	void Update () {
	
	}

    //-------------------------------------
    // Post: Position global de la pince Otool
    public Vector3 PinceGlobalPosition()
    {
        return transform.position;
    }

    //-------------------------------------
    // Post: true ssi la pince est ouverte
    public bool PinceEstOuverte()
    {
        return (etatPince == EtatsPince.Ouverte);
    }

    //-------------------------------------
    // La pince prend l'objet Objet
    // Pre:  Cube à saisir
    //       Etat de l'objet à saisir est Sélectionnable
    //       La pince est ouverte
    // Post: le parent de Objet devient Otool
    //       l'état de l'objet saisi est Sélectionné
    //       la pince est fermée
    //       La propriété isKenematic du RigidBody du cube devient true
    public void PrendCube(GameObject cube)
    {
        cube_saisi = cube;
        cube_saisi.GetComponent<Rigidbody>().isKinematic = true;  // TP3 scène 2. L'objet physicalisé perd sa masse lorsqu'il est pris dans la pince, afin d'être 
        Transform ancien_parent_transform = cube.transform.parent;
        if (ancien_parent_transform != null)
            ancien_parent = ancien_parent_transform.gameObject;
        else
            ancien_parent = null;
        cube_saisi.transform.parent = transform;

        Opince_g.transform.localPosition = new Vector3(-0.017F, 0.0F, 0.0F);
        Opince_d.transform.localPosition = new Vector3(0.017F, 0.0F, 0.0F);
        etatPince = EtatsPince.Fermee;
    }

    //-------------------------------------
    // La pince relache l'objet Objet
    // Pre: cube_saisi est l'objet à relacher
    // Post: le parent de cube_saisie est l'ancien parent de cube_saisi avant la prise de cube par la pince
    //       la pince est ouverte
    //       La propriété isKenematic du RigidBody du cube devient false
    public void RelacheCube( )
    {
        if (ancien_parent != null)
            cube_saisi.transform.parent = ancien_parent.transform;
        else
            cube_saisi.transform.parent = null;
        cube_saisi.GetComponent<Rigidbody>().isKinematic = false;  // TP3 scène 2. L'objet physicalisé reprend sa masse lorsqu'il est relaché par la pince, afin d'être 

        cube_saisi = null;
        Opince_g.transform.localPosition = new Vector3(-0.034F, 0.0F, 0.0F);
        Opince_d.transform.localPosition = new Vector3(0.034F, 0.0F, 0.0F);
        etatPince = EtatsPince.Ouverte;
    }

    //------------------------------------------
    // Post: Retourne  de l'état de la Pince
    public int IntEtatPince()
    {
        int etat;

        if (etatPince == EtatsPince.Ouverte)
            etat = 1;
        else if (etatPince == EtatsPince.Fermee)
            etat = 2;
        else
            etat = -1; // Pas possible normalement

        return etat;
    }

    //------------------------------------------
    // Post: Retourne  de l'état de la Pince
    public string StrEtatPince()
    {
        string str="Pince ";

        if (etatPince == EtatsPince.Ouverte)
            str += "OUVERTE";
        else if (etatPince == EtatsPince.Fermee)
            str += "FERMEE (" + cube_saisi.name + ")";
        else
            str += "*** ERREUR PINCE ***"; // Pas possible normalement

        return str;
    }
}
