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

public class CameraMoveCenter : MonoBehaviour
{

    public GameObject centerLines;
    public GameObject virtualEndoscope;

    //中心点たどるよう変数
    List<Vector3> worldVertices = new List<Vector3>();
    List<float> distanceOfPointsList = new List<float>();
    int posIndex = 0;

    //csv出力用
    float nomalizedNum = (125.6f / 12.4f);
    int whileCount = 0;
    string basePath = "C:\\UnityWorkSpace\\";
    float beforeDistance = 0.0f;

    // Use this for initialization
    void Start()
    {
        var moveMatrix = centerLines.transform.localToWorldMatrix;
        var centerVertices = centerLines.GetComponent<MeshFilter>().mesh.vertices;

        foreach (var vertice in centerVertices)
        {
            worldVertices.Add(moveMatrix.MultiplyPoint3x4(vertice));
        }

        distanceOfPointsList = getDistanceOfPointList(worldVertices);

        if (worldVertices != null)
        {
            virtualEndoscope.transform.position = worldVertices[0];
            virtualEndoscope.transform.LookAt(worldVertices[1]);
        }
        else Debug.Log("ヌル！！！");
    }

    // Update is called once per frame
    void Update()
    {
        string pathToCSV = basePath + whileCount.ToString() + ".csv";

        float insertDistance = getInsertionDistance(pathToCSV);

        if (0.0f < insertDistance && posIndex != worldVertices.Count - 1)
        {
            //ちゅうと半端な時の処理を追加

            while (true)
            {
                if (insertDistance < distanceOfPointsList[posIndex])
                {
                    //ここにいろいろ足す
                    virtualEndoscope.transform.position = worldVertices[posIndex];
                    virtualEndoscope.transform.LookAt(worldVertices[posIndex + 1]);

                    break;
                }

                insertDistance -= distanceOfPointsList[posIndex];
                posIndex++;
            }
        }
        else if (insertDistance < 0.0f && posIndex != 0)
        {
            insertDistance = -insertDistance;

            while (true)
            {
                if (insertDistance < distanceOfPointsList[posIndex - 1])
                {
                    virtualEndoscope.transform.position = worldVertices[posIndex];
                    virtualEndoscope.transform.LookAt(worldVertices[posIndex + 1]);

                    break;
                }

                insertDistance -= distanceOfPointsList[posIndex - 1];
                posIndex--;
            }
        }

        /*
        if(0.0f < insertDistance && posIndex != worldVertices.Count - 1)
        {
            float nextDistance = (virtualEndoscope.transform.position - worldVertices[posIndex + 1]).magnitude;
            
            if(insertDistance <= nextDistance)
            {
                virtualEndoscope.transform.Translate(0.0f, 0.0f, insertDistance);
            }
            else if(nextDistance < insertDistance)
            {
                insertDistance = insertDistance - nextDistance;
                posIndex++;
                //virtualEndoscope.transform.position = worldVertices[posIndex];
                //virtualEndoscope.transform.LookAt(worldVertices[posIndex + 1]);

                while (true)
                {
                    if(posIndex == worldVertices.Count - 1)
                    {
                        break;
                    }

                    insertDistance = insertDistance - distanceOfPointsList[posIndex];

                    if (insertDistance < 0.0f)
                    {
                        insertDistance = insertDistance + distanceOfPointsList[posIndex];
                        virtualEndoscope.transform.position = worldVertices[posIndex];
                        virtualEndoscope.transform.LookAt(worldVertices[posIndex + 1]);
                        virtualEndoscope.transform.Translate(0.0f, 0.0f, insertDistance);
                        break;
                    }

                    posIndex++;
                    //virtualEndoscope.transform.position = worldVertices[posIndex];
                    //virtualEndoscope.transform.LookAt(worldVertices[posIndex + 1]);
                }
            }
        }
        else if(insertDistance < 0.0f && posIndex != 0)
        {
            float beforeDistance = (virtualEndoscope.transform.position - worldVertices[posIndex - 1]).magnitude;

            if (insertDistance <= beforeDistance)
            {
                virtualEndoscope.transform.Translate(0.0f, 0.0f, -insertDistance);
            }
            else if (beforeDistance < insertDistance)
            {
                insertDistance = insertDistance - beforeDistance;
                posIndex--;
                //virtualEndoscope.transform.position = worldVertices[posIndex];
                //virtualEndoscope.transform.LookAt(worldVertices[posIndex + 1]);

                while (true)
                {
                    if (posIndex == 0)
                    {
                        break;
                    }

                    insertDistance = insertDistance - distanceOfPointsList[posIndex - 1];

                    if (insertDistance < 0.0f)
                    {
                        insertDistance = insertDistance + distanceOfPointsList[posIndex - 1];
                        virtualEndoscope.transform.position = worldVertices[posIndex];
                        virtualEndoscope.transform.LookAt(worldVertices[posIndex + 1]);
                        virtualEndoscope.transform.Translate(0.0f, 0.0f, -insertDistance);
                        break;
                    }

                    posIndex--;
                    //virtualEndoscope.transform.position = worldVertices[posIndex];
                    //virtualEndoscope.transform.LookAt(worldVertices[posIndex + 1]);
                }
            }
        }
        */
    }

    /*
     * 返り値: List<Vector3>
     * 引数: カメラに近い順番に並んだ座標値のList
     * 機能: 座標間の距離のListを作成する
     */
    List<float> getDistanceOfPointList(List<Vector3> movePoints)
    {
        var pointsDistanceList = new List<float>();

        for (int i = 0; i < movePoints.Count - 1; i++)
        {
            pointsDistanceList.Add((movePoints[i + 1] - movePoints[i]).magnitude);
        }

        return pointsDistanceList;
    }


    /*
     * 返り値: float
     * 引数: CSVファイルへのパス　string
     * 機能: 挿入距離を取得
     */
    float getInsertionDistance(string pathToCSV)
    {
        float unityMoveDistance = 0.0f;
        float moveDistance = 0.0f;

        if (File.Exists(pathToCSV))
        {
            var moveList = new List<string>();
            var sr = new StreamReader(pathToCSV);

            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                string[] values = line.Split(',');
                moveList.AddRange(values);
            }

            moveDistance = float.Parse(moveList[0]);

            if (beforeDistance != moveDistance)
            {
                unityMoveDistance = moveDistance * nomalizedNum;
                beforeDistance = moveDistance;
            }

            moveList.Clear();
            sr.Close();

            whileCount++;
        }

        return unityMoveDistance;
    }
}

