/********************************************************************************
 *	文件名:	Obj_ClientNPC.cs
 *
 *	功能说明:客户端表现需要的一些NPC
 *	修改记录:
*********************************************************************************/


using Games.GlobeDefine;
using Games.Mission;
using GCGame.Table;
using System.Collections;
using System.Collections.Generic;
using Module.Log;
using UnityEngine;
using Games.Scene;
using Games.ChatHistory;

namespace Games.LogicObj
{
    public class Obj_ClientNPC_Init_Data : Obj_Character_Init_Data
    {
        public Tab_ClientNPC m_ClientNPC;

        public Obj_ClientNPC_Init_Data()
        {
            CleanUp();
        }
        public override void CleanUp()
        {
            base.CleanUp();
            m_ClientNPC = null;
        }
    }

    public class Obj_ClientNPC : Obj_Character
    {
        enum AiState
        {
            None,
            Born,
            Move,
            Moving,
            Action,
            Dialog,
            Fellow,
        }

        AiState m_aiState = AiState.None;
        public override UIPathData HeadUiPath
        {
            get { return Obj_NPCHeadUI.pathData; }
        }

        protected Obj_NPCHeadUI m_headUIObj;
        Tab_ClientNPC m_ClientNPC = null;
        protected int m_ObjId;   
        protected string m_OwerName;
        string stateString = "";
        private float SwapTime = -1;

        public override bool Init(ObjParent_Init_Data initData1)
        {
            bool result = base.Init(initData1);
            if (result == false)
            {
                LogModule.ErrorLog("Base Init Failure!");
                return false;
            }
            Obj_ClientNPC_Init_Data initData = initData1 as Obj_ClientNPC_Init_Data;
            if (initData == null)
                return false;
            m_ObjId = initData.m_OwnerObjId;
            m_OwerName = initData.m_OwerName;
            m_ClientNPC = initData.m_ClientNPC;
            if (m_ClientNPC == null)
                return false;
            stateString = m_ClientNPC.StatList;
            Obj_Character ower = Singleton<ObjManager>.Instance.FindObjCharacterInScene(m_ObjId);
            if (ower != null)
            {
                m_aiState = AiState.Fellow;
                BaseAttr.MoveSpeed = ower.BaseAttr.MoveSpeed;
                ObjTransform.position = ower.Position - ower.transform.forward;
            }
            else
            {
                if(m_ClientNPC!=null && m_ClientNPC.MoveSpeed!=-1)
                {
                    BaseAttr.MoveSpeed = m_ClientNPC.MoveSpeed;
                }
                else
                {
                    Tab_RoleBaseAttr baseAttr = TableManager.GetRoleBaseAttrByID(m_ClientNPC.RoleBaseID, 0);
                    if (baseAttr != null)
                    {
                        BaseAttr.MoveSpeed = baseAttr.MoveSpeed;
                    }
                }
                m_aiState = AiState.Born;
            }
            //初始化寻路代理
            InitNavAgent();
            if(m_ClientNPC.IsShowName==1)
                CreateNameBoard();
            CreateModel(ModelID);
            return true;
        }

        //protected override void CreateModelOver(Hashtable hashParam)
        //{
        //    base.CreateModelOver(hashParam);
        //    InitAnimation();
        //}
//
        public override void InitNameBoard(Obj_HeadUI headUiItem)
        {
            base.InitNameBoard(headUiItem);
            m_headUIObj = (Obj_NPCHeadUI)headUiItem;
            if (m_headUIObj == null)
                return;
            m_headUIObj.SetName(BaseAttr.RoleName);
            if(m_ClientNPC != null)
            {
                m_headUIObj.SetNameColor(GCGame.Utils.GetColorByString(m_ClientNPC.NameColor));
            }
            m_headUIObj.beLongObj.SetActive(false);
            m_headUIObj.boardObj.SetActive(false);
            m_headUIObj.OwerNameText.gameObject.SetActive(false);
            m_headUIObj.HideHp(false);
        }

        AiState GetState(string stateStr,bool DelFirst = false)
        {
            if (string.IsNullOrEmpty(stateString) || stateString.Length<=0)
                return AiState.None;
            char first = stateString[0];
            if (DelFirst)
                stateString = stateString.Remove(0,1);
            if (first == 'A')
            {
                return AiState.Action;
            }
            if (first == 'M')
            {
                return AiState.Move;
            }
            if (first == 'D')
            {
                return AiState.Dialog;
            }
            if (DelFirst)
                stateString = stateString.Remove(0);
            return AiState.None;
        }

        public override void ShowChatBubble(ChatHistoryItem history)
        {
            if (null != m_headUIObj)
            {
                m_headUIObj.ShowChatBubble(history);
            }
        }

        protected override void LateUpdate()
        {
            base.LateUpdate();
            if (m_aiState == AiState.None)
                return;
            switch(m_aiState)
            {
                case AiState.Fellow:
                    {
                        Obj_Character obj = Singleton<ObjManager>.Instance.FindObjCharacterInScene(m_ObjId);
                        if (obj == null)
                            return;
                        if(Vector3.Distance(obj.Position,Position)>=5 && MovementState == MoveState.Static)
                        {
                            Vector3 den = obj.Position - obj.transform.forward;
                            MoveAsMainPlayer(den);
                        }
                        else
                        {
                            if(Vector3.Distance(obj.Position, Position) >= 3)
                            {
                                Vector3 den = obj.Position - obj.transform.forward;
                                MoveAsMainPlayer(den);
                            }
                        }
                    }
                    break;
                case AiState.Born:
                    {
                        m_aiState = GetState(stateString, true);
                        SwapTime = -1;
                    }
                    break;
                case AiState.Move:
                    {
                        if (m_ClientNPC != null && m_ClientNPC.WalkToPosX != -1 && m_ClientNPC.WakeToPosZ != -1)
                        {
                            Vector3 den = new Vector3(m_ClientNPC.WalkToPosX, 0, m_ClientNPC.WakeToPosZ);
                            MoveAsMainPlayer(ActiveScene.GetTerrainPosition(den));
                        }
                        m_aiState = AiState.Moving;
                        SwapTime = -1;
                    }
                    break;
                case AiState.Moving:
                    {
                        if (Vector3.Distance(Position, ServerPos) <= 0.1f && MovementState == MoveState.Static)
                        {
                            if (m_ClientNPC != null && AnimLogic != null && CurObjAnimState == GameDefine_Globe.OBJ_ANIMSTATE.STATE_NORMOR)
                            {
                                m_aiState = GetState(stateString, true);
                                SwapTime = -1;
                            }
                        }
                    }
                    break;
                case AiState.Action:
                    {
                        if (AnimLogic == null)
                            return;
                        if(m_ClientNPC.ActionID==-1 || m_ClientNPC.ActionTime<=0)
                        {
                            SwapTime = -1;
                            m_aiState = GetState(stateString, true);
                            return;
                        }
                        if(SwapTime==-1)
                        {
                            AnimLogic.Play(m_ClientNPC.ActionID);
                            SwapTime = Time.time + m_ClientNPC.ActionTime;
                        }
                        else
                        {
                            if(SwapTime <= Time.time)
                            {
                                SwapTime = -1;
                                CurObjAnimState = GameDefine_Globe.OBJ_ANIMSTATE.STATE_NORMOR;
                                m_aiState = GetState(stateString, true);
                            }
                        }
                    }
                    break;
                case AiState.Dialog:
                    {
                        if (string.IsNullOrEmpty(m_ClientNPC.DialogText) || m_ClientNPC.DialogText == "-1" || m_ClientNPC.DialogTime <= 0)
                        {
                            SwapTime = -1;
                            m_aiState = GetState(stateString, true);
                            return;
                        }
                        if (SwapTime == -1)
                        {
                            SwapTime = Time.time + m_ClientNPC.DialogTime;
                            Games.ChatHistory.ChatHistoryItem histroy = new Games.ChatHistory.ChatHistoryItem();
                            histroy.ChatInfo = m_ClientNPC.DialogText;
                            histroy.Duration = m_ClientNPC.DialogTime;
                            histroy.EChannel = GC_CHAT.CHATTYPE.CHAT_TYPE_INVALID;
                            ShowChatBubble(histroy);
                            if(m_ClientNPC.DialogSoundID!=-1)
                            {
                                GameManager.gameManager.SoundManager.PlaySoundEffect(m_ClientNPC.DialogSoundID);
                            }
                        }
                        else
                        {
                            if (SwapTime <= Time.time)
                            {
                                SwapTime = -1;
                                m_aiState = GetState(stateString, true);
                            }
                        }
                    }
                    break;
            }
        }
    }
}