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

public class SelectionObjet : MonoBehaviour
{
    //private Renderer renderer;
    private Color oldColor;
    private GereSelection gs;
    public enum EtatsObjets { Idle, Slectionnable, Slectionn, Manipul, EnChute, TombAuSol };
    public EtatsObjets etatObjets;
    public Camera cameraAuSol;

    // Met  jour etatObjet
    // dans l'tat Idle
    public void SetIdle()
    {
        etatObjets = EtatsObjets.Idle;
    }
    // dans l'tat Selectionnable
    public void SetSelectionnable()
    {
        etatObjets = EtatsObjets.Slectionnable;
    }
    // dans l'tat Selectionne
    public void SetSelectionne()
    {
        etatObjets = EtatsObjets.Slectionn;
    }
    // dans l'tat EnChute
    public void SetEnChute()
    {
        etatObjets = EtatsObjets.EnChute;
    }
    // dans l'tat Manipule
    public void SetManipule()
    {
        etatObjets = EtatsObjets.Manipul;
    }
    // dans l'tat TombeAuSol
    public void SetTombeAuSol()
    {
        etatObjets = EtatsObjets.TombAuSol;
    }

    // Start is called before the first frame update
    // Initialise les valeur de renderer et de gs
    void Start()
    {
        //renderer = GetComponent<Renderer>();
        gs = this.transform.parent.GetComponent<GereSelection>(); // gs pointe vers le Script GereSelection, port par GrosObjet
        SetIdle();
    }

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

    // Post: l'objet courant est dans l'tat Slectionnable et sa la couleur devient rouge
    //
    private void OnMouseEnter()
    {
        if (etatObjets == EtatsObjets.Idle)
        {
            oldColor = GetComponent<Renderer>().material.color; // On sauve la couleur courante de l'objet port qui porte le script
            GetComponent<Renderer>().material.color = Color.red; // La couleur de l'objet qui porte le script devient rouge
            gs.objetSelectionnable = transform.gameObject; // Met l'information de l'objet graphique slectionnable dans GereSelection, port par GrosObjet
            Debug.Log("[" + transform.name + " SELECTIONNABLE]"); 
            etatObjets = EtatsObjets.Slectionnable; // L'tat associ est Selectionnable
        }
    }

    // L'objet qui porte le script reprend sa couleur initiale et l'tat associ devient Idle
    private void OnMouseExit()
    {
        if (etatObjets == EtatsObjets.Slectionnable)
        {
            GetComponent<Renderer>().material.color = oldColor;
            gs.objetSelectionnable = null;
            etatObjets = EtatsObjets.Idle;
        }
    }

    // Gestion de la collision de l'objet portant le script avec l'objet de name 'Sol'
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.name == "Sol")
        {
            transform.GetComponent<Rigidbody>().isKinematic = true; // On arrte la physicalisation de l'objet
            etatObjets = EtatsObjets.TombAuSol;
            GetComponent<Renderer>().material.color = oldColor;
            cameraAuSol.enabled = false; // La camra au sol est dsactive aprs la chute
        }
        else if (collision.gameObject.transform.GetComponent<SelectionObjet>().etatObjets == EtatsObjets.TombAuSol) // Si l'objet rentre en collision avec un objet dont l'tat est TombAuSol, son tat devient galement TombAuSol
        {
            transform.GetComponent<Rigidbody>().isKinematic = true; // On arrte la physicalisation de l'objet
            etatObjets = EtatsObjets.TombAuSol;
            GetComponent<Renderer>().material.color = oldColor;
            cameraAuSol.enabled = false; // La camra au sol est dsactive aprs la chute
        }
    }
}
