// 本脚本只在不存在时会生成一次。已存在不会再次生成覆盖

using System;
using System.Collections.Generic;
using System.Text;
using FairyGUI;
using Fantasy;
using Fantasy.Async;
using Fantasy.Network;
using NBC;
using UnityEngine;
using Log = NBC.Log;
using UIPanel = NBC.UIPanel;

namespace NBF
{
    public partial class ChatTestPanel : UIPanel
    {
        private List<string> _messages = new List<string>();

        protected override void OnInit()
        {
            this.AutoAddClick(OnClick);
        }

        protected override void OnShow()
        {
        }

        private void RefreshList()
        {
            ChatList.RemoveChildrenToPool();
            foreach (var item in _messages)
            {
                if (ChatList.AddItemFromPool() is ChatItem chatItem)
                {
                    chatItem.InitData(item);
                }
            }
        }

        private void OnClick(GComponent btn)
        {
            if (btn == BtnSendWorld)
            {
                OnSendMessage(InputMessage.title).Coroutine();
            }
            else if (btn == BtnSendFriend)
            {
                OnSendFriendMessage().Coroutine();
            }
        }

        #region 发生消息测试

        private async FTask OnSendMessage(string message)
        {
            var tree = ChatTreeFactory.Broadcast(Game.Main);
            tree = tree.AddendPositionNode(message, "勇者大陆", 121, 131, 111);

            var response = (Chat2C_SendMessageResponse)await Net.Call(new C2Chat_SendMessageRequest()
            {
                ChatInfoTree = tree
            });
            if (response.ErrorCode != 0)
            {
                Log.Error($"发送聊天消息失败 ErrorCode:{response.ErrorCode}");
            }
            else
            {
                Log.Info("发送消息成功");
            }
        }

        private async FTask OnSendFriendMessage()
        {
            var tree = ChatTreeFactory.Private();
            tree.Target.Add(Convert.ToInt64(InputFriendId.text));
            tree.AddendTextNode("你好，欢迎来到Fantasy Chat！")
                .AddendLinkNode("点击这里http://www.fantasy.com.cn", "http://www.fantasy.com.cn");

            var response = (Chat2C_SendMessageResponse)await Net.Call(new C2Chat_SendMessageRequest()
            {
                ChatInfoTree = tree
            });
            if (response.ErrorCode != 0)
            {
                Log.Error($"发送私聊消息失败 ErrorCode:{response.ErrorCode}");
            }
        }

        public void Message(ChatInfoTree tree)
        {
            // _messages.Add(message);

            var sb = new StringBuilder();
            foreach (var chatInfoNode in tree.Node)
            {
                // 这里只是演示一下处理事件的效果，实际使用时，需要根据实际情况处理事件
                // 明显我现在这样做的方式不是对的，应该是自己拼接一个聊天信息，然后调用这个接口来处理事件
                // entryComponent.Entry.ChatNodeEventButton.onClick.RemoveAllListeners();
                // entryComponent.Entry.ChatNodeEventButton.onClick.AddListener(() =>
                // {
                //     ChatNodeEventHelper.Handler(scene, chatInfoNode);
                // });
                sb.Append(chatInfoNode.Content);
            }

            _messages.Add(sb.ToString());
            RefreshList();
        }

        #endregion
    }
}