using Fantasy;
using Fantasy.Async;
using Fantasy.Platform.Net;

namespace NB.Chat;

public static class SocialSceneHelper
{
    #region 消息发送

    /// <summary>
    /// 发送一条私聊
    /// </summary>
    /// <param name="scene"></param>
    /// <param name="selfId"></param>
    /// <param name="targetId"></param>
    /// <param name="message"></param>
    public static void PrivateMessage(Scene scene, long selfId, long targetId, ChatMessageInfo message)
    {
        var chatUnitManage = scene.GetComponent<SocialUnitManageComponent>();
        if (chatUnitManage == null) return;
        var chatUnit = chatUnitManage.Get(targetId);
        message.Type = 1;
        message.Source = selfId;
        if (chatUnit != null)
        {
            //对方在线
            BroadcastAll(scene, message, [targetId]);
        }
        else
        {
            //对方不在线，存入待领取列表，等待玩家下次登录领取
            chatUnitManage.SaveOfflineMessage(targetId, message);
        }
    }

    /// <summary>
    /// 发送一条地图消息
    /// </summary>
    /// <param name="scene"></param>
    /// <param name="mapId"></param>
    /// <param name="message"></param>
    public static void BroadcastMap(Scene scene, long mapId, ChatMessageInfo message)
    {
        var chatUnitManage = scene.GetComponent<SocialUnitManageComponent>();
        if (chatUnitManage == null) return;
        HashSet<long> targets = new HashSet<long>();
        foreach (var (_, chatUnit) in chatUnitManage.Units)
        {
            if (chatUnit.MapId == mapId)
            {
                targets.Add(chatUnit.Id);
            }
        }

        if (targets.Count < 1)
        {
            Log.Info("地图在线人数为0，群发取消");
            return;
        }

        BroadcastAll(scene, message, targets);
    }

    /// <summary>
    /// 发送一条频道消息
    /// </summary>
    /// <param name="scene"></param>
    /// <param name="channelId"></param>
    /// <param name="message"></param>
    public static void BroadcastChannel(Scene scene, long channelId, ChatMessageInfo message)
    {
        var chatUnitManage = scene.GetComponent<SocialUnitManageComponent>();
        if (chatUnitManage == null) return;
        HashSet<long> targets = new HashSet<long>();
        foreach (var (_, chatUnit) in chatUnitManage.Units)
        {
            if (chatUnit.CurrentChannel == channelId)
            {
                targets.Add(chatUnit.Id);
            }
        }

        if (targets.Count < 1)
        {
            Log.Info("频道在线人数为0，群发取消");
            return;
        }

        BroadcastAll(scene, message, targets);
    }

    /// <summary>
    /// 广播消息给所有人
    /// </summary>
    /// <param name="scene"></param>
    /// <param name="message"></param>
    /// <param name="targets"></param>
    public static void BroadcastAll(Scene scene, ChatMessageInfo message, HashSet<long>? targets = null)
    {
        //发送给所有Gate服务器，让Gate转发给其他客户端
        var gateConfigs = SceneConfigData.Instance.GetSceneBySceneType(SceneType.Gate);
        var sendMessage = new S2G_ChatMessage()
        {
            Message = message,
        };
        if (targets != null && targets.Count > 0)
        {
            sendMessage.IdList.AddRange(targets);
        }

        var networkMessagingComponent = scene.NetworkMessagingComponent;
        foreach (var config in gateConfigs)
        {
            //发送给Gate服务器转发消息
            networkMessagingComponent.SendInnerRoute(config.RouteId, sendMessage);
        }
    }

    #endregion


    #region 上线下线

    // public static async FTask<(long, long)> Online(Scene scene, RoleSimpleInfo roleSimple, long gateRuntimeId)
    // {
    //     var gameSceneConfig = GetSceneConfig();
    //     var gameRouteId = gameSceneConfig.RouteId;
    //     //连接到游戏中心服
    //     var gameResponse = (S2G_EnterResponse)await scene.NetworkMessagingComponent.CallInnerRoute(
    //         gameRouteId, new G2S_EnterRequest()
    //         {
    //             Role = roleSimple,
    //             GateRouteId = gateRuntimeId
    //         });
    //
    //     if (gameResponse.ErrorCode != 0)
    //     {
    //         return (0, 0);
    //     }
    //
    //     return (gameResponse.RoleRouteId, gameRouteId);
    // }
    //
    // public static async FTask Offline(Scene scene, long accountId, long gateRuntimeId, long sceneRouteId)
    // {
    //     for (int i = 0; i < 10; i++)
    //     {
    //         var gameResponse = (S2G_ExitResponse)await scene.NetworkMessagingComponent.CallInnerRoute(
    //             sceneRouteId, new G2S_ExitRequest()
    //             {
    //                 AccountId = accountId,
    //                 GateRouteId = gateRuntimeId
    //             });
    //         if (gameResponse.ErrorCode == 0)
    //         {
    //             return;
    //         }
    //     }
    //
    //     Log.Error("重试多次还是退出失败，需检查");
    // }
    //
    // private static SceneConfig GetSceneConfig()
    // {
    //     var gameSceneConfigs = SceneConfigData.Instance.GetSceneBySceneType(SceneType.Social);
    //
    //     return gameSceneConfigs.First();
    // }

    #endregion
}