using Thousandto.Code.Center;
using Thousandto.Code.Logic;
using Thousandto.Core.Base;
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;

namespace Thousandto.Code.Logic
{
    /// <summary>
    /// 一句聊天内容包含多个ChatNode,这个类就是管理这些ChatNode的,
    /// 
    /// </summary>
    public class OneTalkManager
    {
        public int CurrentChannel { get; set; }
        public GameObject Label { get; set; }
        public bool HasSetClickEvent { get; set; }

        private Dictionary<int, Dictionary<ChatNode, List<Rect>>> _dataDic = new Dictionary<int, Dictionary<ChatNode, List<Rect>>>();
        public OneTalkManager()
        {
        }

        /// <summary>
        /// 添加ChatNode对应的Rect范围,用于点击UILabel获取到坐标,判断是否落在Rect范围
        /// </summary>
        /// <param name="node"></param>
        /// <param name="rect"></param>
        public void AddNode(int chatChannel, ChatNode node, Rect rect)
        {
            CurrentChannel = chatChannel;
            int channel = chatChannel;
            if (_dataDic.ContainsKey(channel))
            {
                Dictionary<ChatNode, List<Rect>> nodeToRectDic = _dataDic[channel];
                if (!nodeToRectDic.ContainsKey(node))
                {
                    List<Rect> rectList = new List<Rect>();
                    rectList.Add(rect);
                    nodeToRectDic.Add(node, rectList);
                }
                else
                {
                    nodeToRectDic[node].Add(rect);
                }
            }
            else
            {
                List<Rect> rectList = new List<Rect>();
                rectList.Add(rect);
                Dictionary<ChatNode, List<Rect>> nodeToRectDic = new Dictionary<ChatNode, List<Rect>>();
                nodeToRectDic.Add(node, rectList);

                _dataDic.Add(channel, nodeToRectDic);
            }
        }

        //返回当前聊天内容中所有的ChatNode节点
        public List<ChatNode> GetChatNodeByChannel(int channel)
        {
            if (!_dataDic.ContainsKey(channel))
            {
                return null;
            }

            Dictionary<ChatNode, List<Rect>> nodeRectDic = _dataDic[channel];
            List<ChatNode> nodeList = new List<ChatNode>();
            var itor = nodeRectDic.Keys.GetEnumerator();
            while (itor.MoveNext())
            {
                nodeList.Add(itor.Current);
            }

            return nodeList;
        }


        /// <summary>
        /// 获取带img的节点, 包括表情、vip、语音图片
        /// </summary>
        /// <param name="channel"></param>
        /// <returns></returns>
        public List<ChatNode> GetImageChatNode(int channel)
        {
            List<ChatNode> imgNodes = new List<ChatNode>();
            List<ChatNode> nodes = GetChatNodeByChannel(channel);
            for (int i = 0; nodes != null && i < nodes.Count; ++i)
            {
                if (nodes[i].Type == (int)TNodeType.Image ||
                    nodes[i].Type == (int)TNodeType.BigImage ||
                    nodes[i].Type == (int)TNodeType.ImageEx || 
                    nodes[i].Type == (int)TNodeType.Vip ||
                    nodes[i].Type == (int)TNodeType.Audio)
                {
                    imgNodes.Add(nodes[i]);
                }
            }

            return imgNodes;
        }

        public void OnClick(GameObject go)
        {
            //20180327-yuqiang-屏蔽掉打开不能发言的频道
            var keyItor = _dataDic[CurrentChannel].Keys.GetEnumerator();
            keyItor.MoveNext();
            if (keyItor.Current.ChannelID != (int)ChatChanelType.JOINTEAM &&
               keyItor.Current.ChannelID != (int)ChatChanelType.Experience)
            {
                GameCenter.ChatSystem.Open(keyItor.Current.ChannelID);
            }
            else
                GameCenter.ChatSystem.Open();
            return;
            
            {
                //获取屏幕坐标
                Vector3 mScreenPos = Input.mousePosition;
                //定义射线  
                Ray mRay = GameCenter.ChatSystem.UICamera.ScreenPointToRay(mScreenPos);
                RaycastHit[] hits = Physics.RaycastAll(mRay);
                for (int i = 0; hits != null && i < hits.Length; ++i)
                {
                    if (hits[i].collider.gameObject == Label)
                    {
                        Vector3 tPos = hits[i].point;
                        Vector3 lPos = go.transform.InverseTransformPoint(tPos);

                        if (!_dataDic.ContainsKey(CurrentChannel))
                        {
                            return;
                        }

                        Dictionary<ChatNode, List<Rect>> nodeToRectDir = _dataDic[CurrentChannel];

                        var itor = nodeToRectDir.GetEnumerator();
                        float x = 0;
                        float y = 0;
                        float width = 0;
                        float height = 0;
                        int line = 0;
                        while (itor.MoveNext())
                        {
                            ChatNode node = itor.Current.Key;

                            //表情跳过
                            if (node.Type == (int)TNodeType.Image || node.Type == (int)TNodeType.BigImage || node.Type == (int)TNodeType.ImageEx || node.Type == (int)TNodeType.Vip)
                            {
                                continue;
                            }

                            List<Rect> rectList = itor.Current.Value;

                            //换行了
                            if (line != node.Line)
                            {
                                x = 0;
                                line = node.Line;
                            }

                            y = -(node.Height * (node.Line));
                            width = node.Width;
                            height = node.Height;
                            for (int m = 0; m < rectList.Count; ++m)
                            {
                                if (x <= lPos.x &&
                                    y >= lPos.y &&
                                    x + width >= lPos.x &&
                                    y - height <= lPos.y)
                                {
                                    if (node.GO == null)
                                    {
                                        node.TriggerClick(go);
                                    }
                                    else
                                        node.TriggerClick(node.GO);
                                    return;
                                }
                            }

                            x += node.Width;
                        }
                    }
                }
            }
        }

        public void Destory()
        {

            if (Label != null)
            {
                GameObject.Destroy(Label);
            }
        }
    }
}