﻿using UnityEngine;
using System.Collections;
using System.IO;

//-----------------------------------------
// Trace des éléments essentiels du jeu dans un fichier
// Pre: traceFile: nom du fichier
//      estTrace: booleen, vrai ssi les données sont tracées dans le fichier
public class TraceDataTP3scene1 : MonoBehaviour
{
    public string traceFile = "log.dat";
    public bool estTrace = false;
    public bool debugConsole = false;
    public CameraScript gestionCamera;
    public MachineAEtatsTP3scene1 mae;
    public ApplicationTP2 app;
    public PrendObjetTP2scene4 gerePince;
    private StreamWriter f;
    private GameObject O0;
    private GameObject Opince;

    //------------------------------------------
    string StrInt(int val)
    {
        return val.ToString() + " ";
    }

    //------------------------------------------
    void TraceInt(int val)
    {
        f.Write(StrInt(val));
    }

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

    string StrFloat(float val)
    {
        return val.ToString("0.0000") + " ";
    }

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

    void TraceFloat(float val)
    {
        f.Write(StrFloat(val));
    }

    //------------------------------------------
    string StrVector3(Vector3 v)
    {
        return "[" + v.x.ToString("0.000") + "," + v.y.ToString("0.000") + "," + v.z.ToString("0.000") + "]";
    }

    //------------------------------------------
    void TraceVector3(Vector3 v)
    {
        TraceFloat(v.x);
        TraceFloat(v.y);
        TraceFloat(v.z);
    }

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

    void TraceTime()
    {
        float elapsedTime = Time.time;
        TraceFloat(elapsedTime);
    }

    //------------------------------------------
    void TraceBaseMobilePosition()
    {
        TraceVector3(O0.transform.position);
    }

    //------------------------------------------
    string StrBaseMobilePosition()
    {
        return StrVector3(O0.transform.position);
    }

    //------------------------------------------
    void TraceBaseMobileEuler()
    {
        TraceVector3(O0.transform.eulerAngles);
    }

    //------------------------------------------
    void StrBaseMobileEuler()
    {
        StrVector3(O0.transform.eulerAngles);
    }

    //------------------------------------------
    void TracePincePosition()
    {
        TraceVector3(Opince.transform.position);
    }

    //------------------------------------------
    void StrPincePosition()
    {
        StrVector3(Opince.transform.position);
    }

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

    void TraceEtatsJeu()
    {
        TraceInt(app.IntEtatJeu());
    }

    //------------------------------------------
    void TraceEtatVR()
    {
        if (mae.etatVR == MachineAEtatsTP3scene1.EtatsVR.Navigation)
            TraceInt(1);
        else if (mae.etatVR == MachineAEtatsTP3scene1.EtatsVR.Selection)
            TraceInt(2);
        else if (mae.etatVR == MachineAEtatsTP3scene1.EtatsVR.Manipulation)
            TraceInt(3);
        else
            TraceInt(-1); // Pas possible normalement
    }

    //------------------------------------------
    void TraceEtatPince()
    {
        TraceInt(gerePince.IntEtatPince());
    }

    //------------------------------------------
    void TraceEtatCamera()
    {
        TraceInt(gestionCamera.IntCameraActive());
    }

    //------------------------------------------
    void TraceNewLine()
    {
        string str;
        str = "\r\n";
        //f.Write(System.Text.Encoding.UTF8.GetBytes(str), 0, (int)str.Length);
        f.Write(str);
    }

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

    void TraceNbObjetsEnZoneDepot()
    {
        TraceInt(app.NbObjetsEnZoneDepot());
    }

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

    void TraceMaxObjets()
    {
        TraceInt(app.MAX_NB_OBJECTS_TP2);
    }

    //------------------------------------------
    void TraceObjetSectionnable()
    {
        TraceInt(mae.IntObjetSelectionnable());
    }

    //------------------------------------------
    void TraceObjetSectionne()
    {
        TraceInt(mae.IntObjetSelectionne());
    }


    //------------------------------------------
    public void TraceFrame()
    {
        TraceTime();
        TraceEtatsJeu();
        TraceEtatVR();
        TraceEtatPince();
        TraceEtatCamera();
        TraceMaxObjets();
        TraceNbObjetsEnZoneDepot();
        TraceObjetSectionnable();
        TraceObjetSectionne();
        TraceBaseMobilePosition();
        TraceBaseMobileEuler();
        TracePincePosition();
        TraceNewLine();
    }


    //------------------------------------------
    // 
    void Start()
    {
        File.Delete(traceFile);

        Opince = GameObject.Find("Otool").gameObject;
        O0 = GameObject.Find("O0").gameObject;
    }


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

        if (estTrace == true)
        {
            f = File.AppendText(traceFile);
            TraceFrame();
            f.Close();
        }
    }

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

}
