using UnityEngine;
using UnityEngine.AI;
using System.Collections;
using GCGame.Table;

public class SignPostObjInfo
{
    private GameObject _SignPostObj = null;
    private SignPostObjInfo _Next;

    public GameObject SignPostObj
    {
        get { return _SignPostObj; }
    }

    public void ClearUp()
    {
        if (_SignPostObj != null)
        {
            _SignPostObj.SetActive(false);
            GameObject.Destroy(_SignPostObj);
            _SignPostObj = null;
        }
        if (_Next != null)
            _Next.ClearUp();
    }

    public void LookAt(SignPostObjInfo other)
    {
        if (_SignPostObj != null && other != null && other.SignPostObj != null)
            _SignPostObj.transform.LookAt(other.SignPostObj.transform);
    }

    public void Hide()
    {
        if (_SignPostObj != null)
            _SignPostObj.SetActive(false);
        if (_Next != null)
            _Next.Hide();
    }

    public SignPostObjInfo SetPosiotn(Vector3 NewPos)
    {
        if (_SignPostObj == null)
        {
            _SignPostObj = Singleton<SignPostManager>.Instance.Instantiate();
        }
        if (_SignPostObj != null)
        {
            _SignPostObj.SetActive(true);
            _SignPostObj.transform.position = Games.Scene.ActiveScene.GetTerrainPosition(NewPos);
            if (_Next == null)
                _Next = new SignPostObjInfo();
            return _Next;
        }
        return null;
    }
}

public class SignPost
{
    private SignPost _Next; //路径的下一个点
    private SignPost _Last; //路径的前一个点
    private Vector3 _Position = Vector3.zero;
    private int _SignPostTabID = -1;
    private SignPostObjInfo _SignInfoRoot = null;

    public SignPost(int TabID)
    {
        _SignPostTabID = -1;
        Tab_SignPost sign = TableManager.GetSignPostByID(TabID, 0);
        if (sign == null || sign.SceneID != GameManager.gameManager.RunningScene)
            return;
        _SignPostTabID = TabID;
    }

    public int SignPostID
    {
        get { return _SignPostTabID; }
    }

    public Vector3 Position
    {
        get { return _Position; }
    }

    public bool CreateSign(SignPost Last,Vector3 TargetDestant)
    {
        Tab_SignPost Signtab = TableManager.GetSignPostByID(_SignPostTabID, 0);
        if (Signtab == null)
            return false;
        _Last = Last;
        _Position.x = Signtab.PosX;
        _Position.z = Signtab.PosZ;

        if (Games.Scene.ActiveScene.GetTerrainPosition(ref _Position) == false)
        {
            return false;
        }

        if (Signtab.Next!=-1)
        {
            SignPost point = new SignPost(Signtab.Next);
            if (point.CreateSign(this, TargetDestant))
                _Next = point;
        }
        return true;
    }

    public void ShowSign(bool needShow = false)
    {
        if(needShow == true)
        {
            if(_Last!=null)
            {
                if (_SignInfoRoot == null)
                    _SignInfoRoot = new SignPostObjInfo();
                if (ShowSign(_Last.Position, Position, _SignInfoRoot) && _Next!=null)
                {
                    _Next.ShowSign(true);
                }
            }
        }
        else
        {
            Vector3 SelfPos = Position;
            SelfPos.y = 0;
            Vector3 DstPos = SignPostManager.Instance.GhattyCurrDestent;
            DstPos.y = 0;
            float dis = Vector3.Distance(SelfPos, DstPos);
            if (dis < 5)
            {
                if (_SignInfoRoot == null)
                    _SignInfoRoot = new SignPostObjInfo();
                if (ShowSign(SignPostManager.Instance.GhattyCurrPosition, Position, _SignInfoRoot) && _Next!=null)
                {
                    if (CrossServerMap.Instance != null && Singleton<SignPostManager>.Instance.GhattyCurrPathID!=-1)
                    {
                        CrossServerMap.Instance.EndSet();
                        CrossServerMap.Instance.StartSet();
                    }

                    _Next.ShowSign(true);
                }
            }
            else
            {
                if (_SignInfoRoot != null)
                    _SignInfoRoot.ClearUp();
                if (_Next != null)
                    _Next.ShowSign();
            }
        }

    }

    private bool ShowSign(Vector3 Start,Vector3 End, SignPostObjInfo Current)
    {
        UnityEngine.AI.NavMeshPath path = new NavMeshPath();
        if (UnityEngine.AI.NavMesh.CalculatePath(Start, End, -1, path) == false)
            return false;
        return ShowSign(path.corners, Current);
    }

    private bool ShowSign(Vector3[] corners, SignPostObjInfo Current)
    {
        int CountPoint = 0;
        var distance = 0f;
        Vector3 lastPos = Vector3.zero;
        Vector3 Pos = Vector3.zero;
        SignPostObjInfo Last = null;
        for (int i = 0; i < corners.Length; i++)
        {
            if (i + 1 >= corners.Length)
                break;
            var start = corners[i];
            var end = corners[i + 1];
            var length = Vector3.Distance(start, end);
            while (distance < length)
            {
                // 最后一个点把长度保留到下一段路径
                Pos = Vector3.Lerp(start, end, distance / length);
                Pos = Games.Scene.ActiveScene.GetTerrainPosition(Pos);

                if (CrossServerMap.Instance != null && Singleton<SignPostManager>.Instance.GhattyCurrPathID != -1)
                    CrossServerMap.Instance.GharryPath(Pos);

                SignPostObjInfo Next = Current.SetPosiotn(Pos);
                if (Next == null)
                {
                    return false;
                }
                if (Last != null)
                    Last.LookAt(Current);
                Last = Current;
                Current = Next;
                distance = distance + 3;
                CountPoint++;
            }
            distance -= length;
        }
        if (Last != null)
            Last.Hide();
        return true;
    }
    public void ClearUp()
    {
        if (_SignInfoRoot != null)
            _SignInfoRoot.ClearUp();

        if (_Next != null)
            _Next.ClearUp();

        _Next = null;
        _Last = null;
        _Position = Vector3.zero;
        _SignPostTabID = -1;
        _SignInfoRoot = null;


    }

    public void Update()
    {

    }
}