#nullable enable
using System.Threading.Tasks;
using UnityEngine;
using IGP.UnitySDK.Models;

namespace IGP.UnitySDK
{
    /// <summary>
    /// 队伍管理器 - 提供队伍分配、状态查询等功能
    /// </summary>
    public class IGPTeamManager : MonoBehaviour
    {
        [Header("References")]
        [SerializeField] private IGPRuntimeManager? arenaManager;

        void Start()
        {
            if (arenaManager == null)
            {
                arenaManager = FindAnyObjectByType<IGPRuntimeManager>();
            }

            if (arenaManager == null)
            {
                Debug.LogError("[IGPTeamManager] IGPRuntimeManager not found!");
                enabled = false;
            }
        }

        /// <summary>
        /// 获取房间队伍列表
        /// </summary>
        public async Task<Team[]?> GetTeamsAsync()
        {
            if (arenaManager == null || string.IsNullOrEmpty(arenaManager.CurrentRoomId))
            {
                Debug.LogError("[IGPTeamManager] Not in a room");
                return null;
            }

            await arenaManager.RefreshHostedRoomAsync();
            return arenaManager.CurrentRoomData?.teams;
        }

        /// <summary>
        /// 获取队伍状态（包含是否可以开始游戏）
        /// </summary>
        public async Task<TeamStatusResponse?> GetTeamStatusAsync()
        {
            if (arenaManager == null || string.IsNullOrEmpty(arenaManager.CurrentRoomId))
            {
                Debug.LogError("[IGPTeamManager] Not in a room");
                return null;
            }

            await arenaManager.RefreshHostedRoomAsync();
            var room = arenaManager.CurrentRoomData;
            var teams = room?.teams ?? System.Array.Empty<Team>();
            var teamStatus = new TeamStatusInfo[teams.Length];
            var allTeamsFull = teams.Length > 0;

            for (var i = 0; i < teams.Length; i++)
            {
                var team = teams[i];
                var currentPlayers = team.playerCount;
                var isFull = team.maxPlayers > 0 && currentPlayers >= team.maxPlayers;
                allTeamsFull &= isFull;
                teamStatus[i] = new TeamStatusInfo
                {
                    teamId = team.id,
                    teamName = team.name,
                    currentPlayers = currentPlayers,
                    maxPlayers = team.maxPlayers,
                    isFull = isFull,
                };
            }

            return new TeamStatusResponse
            {
                canStart = allTeamsFull,
                allTeamsFull = allTeamsFull,
                teams = teamStatus,
                message = allTeamsFull ? "All teams are full" : "Waiting for more players",
            };
        }

        /// <summary>
        /// 分配玩家到队伍
        /// </summary>
        public async Task<bool> AssignPlayerToTeamAsync(string playerId, string teamId)
        {
            if (arenaManager == null || string.IsNullOrEmpty(arenaManager.CurrentRoomId))
            {
                Debug.LogError("[IGPTeamManager] Not in a room");
                return false;
            }

            if (!string.Equals(playerId, arenaManager.PlayerId, System.StringComparison.Ordinal))
            {
                throw new IGPSDKException("Hosted team assignment only supports the current player");
            }

            try
            {
                Debug.Log($"[IGPTeamManager] Assigning player {playerId} to team {teamId}");

                await arenaManager.ChangeHostedTeamAsync(teamId);
                Debug.Log("[IGPTeamManager] Player assigned to team successfully");
                return true;
            }
            catch (System.Exception ex)
            {
                Debug.LogError($"[IGPTeamManager] Failed to assign player to team: {ex.Message}");
                return false;
            }
        }

        /// <summary>
        /// 获取指定队伍详情
        /// </summary>
        public async Task<Team?> GetTeamAsync(string teamId)
        {
            if (arenaManager == null || string.IsNullOrEmpty(arenaManager.CurrentRoomId))
            {
                Debug.LogError("[IGPTeamManager] Not in a room");
                return null;
            }

            var teams = await GetTeamsAsync();
            if (teams == null)
            {
                return null;
            }

            foreach (var team in teams)
            {
                if (team != null && string.Equals(team.id, teamId, System.StringComparison.Ordinal))
                {
                    return team;
                }
            }

            return null;
        }

        /// <summary>
        /// 获取队伍玩家列表
        /// </summary>
        public async Task<Player[]?> GetTeamPlayersAsync(string teamId)
        {
            if (arenaManager == null || string.IsNullOrEmpty(arenaManager.CurrentRoomId))
            {
                Debug.LogError("[IGPTeamManager] Not in a room");
                return null;
            }

            await arenaManager.RefreshHostedRoomAsync();
            var room = arenaManager.CurrentRoomData;
            if (room?.players == null)
            {
                return System.Array.Empty<Player>();
            }

            var players = new System.Collections.Generic.List<Player>();
            foreach (var player in room.players.Values)
            {
                if (player != null && string.Equals(player.teamId, teamId, System.StringComparison.Ordinal))
                {
                    players.Add(player);
                }
            }

            return players.ToArray();
        }

        /// <summary>
        /// 检查是否可以开始游戏（所有队伍满员）
        /// </summary>
        public async Task<bool> CanStartGameAsync()
        {
            var status = await GetTeamStatusAsync();
            return status != null && status.canStart;
        }
    }
}
