#nullable enable
using System;
using System.Collections.Generic;
using UnityEngine;

namespace IGP.Multiplayer.Models
{
    /// <summary>
    /// 房间状态枚举（字符串格式，用于 API 请求）
    /// </summary>
    public enum RoomStatus
    {
        Waiting,
        Playing,
        Paused,
        Ended
    }

    /// <summary>
    /// 房间信息
    /// </summary>
    [Serializable]
    public class Room
    {
        public string id = string.Empty;
        public string code = string.Empty;
        public string name = string.Empty;
        public string gameId = string.Empty;
        public string status = "waiting";
        public int maxPlayers;
        public string hostId = string.Empty;
        public string hostName = string.Empty;
        public string hostAvatar = string.Empty;
        public string createdAt = string.Empty;
        public string updatedAt = string.Empty;
        public string mapPublicId = string.Empty;
        public string mapVersion = string.Empty;
        public int? mapVersionId;
        public int playerCount;
        public string sceneGate = string.Empty;

        // 玩家列表
        public Dictionary<string, Player> players = new Dictionary<string, Player>();

        // 全局状态
        public Dictionary<string, object> globalState = new Dictionary<string, object>();

        // 队伍系统（新增）
        public Team[] teams = Array.Empty<Team>();

        // Room Control projection. Game state remains outside this model.
        public string[] waitingPlayerIds = Array.Empty<string>();
        public IGPRoomFinishedSummary? finishedSummary;
    }

    [Serializable]
    public sealed class IGPRoomFinishedSummary
    {
        public string reason = string.Empty;
        public long finishedAtUnixMs;
        public IGPRoomFinishedPlayer[] players = Array.Empty<IGPRoomFinishedPlayer>();
    }

    [Serializable]
    public sealed class IGPRoomFinishedPlayer
    {
        public string playerId = string.Empty;
        public string teamId = string.Empty;
        public int placement;
        public long score;
    }

    [Serializable]
    public class IGPMapChangeData
    {
        public string roomId = string.Empty;
        public string previousMapPublicId = string.Empty;
        public int? previousMapVersionId;
        public string currentMapPublicId = string.Empty;
        public int? currentMapVersionId;
        public Room? room;
    }

    [Serializable]
    public class IGPSceneGateChangeData
    {
        public string roomId = string.Empty;
        public string previousValue = string.Empty;
        public string currentValue = string.Empty;
        public Room? room;
    }

    /// <summary>
    /// Player 信息
    /// </summary>
    [Serializable]
    public class Player
    {
        public string id = string.Empty;
        public string name = string.Empty;
        public string color = string.Empty;
        public string avatar = string.Empty;
        public int avatarIndex = 0;
        public string roomId = string.Empty;
        public string teamId = string.Empty;
        public bool isBot;
        public bool isReady;
        public Dictionary<string, object> state = new Dictionary<string, object>();
        public string lastSeen = string.Empty;
        public string joinedAt = string.Empty;
        public string disconnectedAt = string.Empty;
    }

    /// <summary>
    /// 启动票据兑换响应
    /// </summary>
    [Serializable]
    internal class LaunchTicketRedeemResponse
    {
        public bool success;
        public string roomId = string.Empty;
        public string roomCode = string.Empty;
        public string playerId = string.Empty;
        public Player player = new Player();
        public string token = string.Empty;
        public string expiresAt = string.Empty;
        public string serverUrl = string.Empty;
        public string sessionEndpoint = string.Empty;
        public string sessionSecret = string.Empty;
    }

    /// <summary>
    /// 启动参数解析结果
    /// </summary>
    [Serializable]
    public class IGPLaunchOptions
    {
        public string launchTicket = string.Empty;
        public string bootstrapEndpoint = string.Empty;
        public string bootstrapSecret = string.Empty;
        public string ipcPipeName = string.Empty;
        public int? appId;
    }

    /// <summary>
    /// IGP 成就上报结果
    /// </summary>

    /// <summary>
    /// IGP 进度型成就上报值语义。
    /// </summary>

    /// <summary>
    /// IGP 成就清除结果
    /// </summary>

    /// <summary>
    /// 队伍模型
    /// </summary>
    [Serializable]
    public class Team
    {
        public string id = string.Empty;
        public string name = string.Empty;
        public string color = string.Empty;
        public string icon = string.Empty;
        public int maxPlayers;
        public int minPlayersToStart;
        public int playerCount;
        public Dictionary<string, object> customData = new Dictionary<string, object>();
        public string createdAt = string.Empty;
    }

    /// <summary>
    /// 队伍配置（用于创建房间时初始化队伍系统）
    /// </summary>
    [Serializable]
    public class TeamConfig
    {
        public string id = string.Empty;
        public string name = string.Empty;
        public string color = string.Empty;
        public string icon = string.Empty;
        public int maxPlayers;
        public int minPlayersToStart;
        public Dictionary<string, object> customData = new Dictionary<string, object>();
    }

    /// <summary>
    /// 队伍状态信息
    /// </summary>
    [Serializable]
    public class TeamStatusInfo
    {
        public string teamId = string.Empty;
        public string teamName = string.Empty;
        public int currentPlayers;  // 使用 currentPlayers 而非 currentCount，保持命名一致
        public int maxPlayers;
        public bool isFull;
    }

    /// <summary>
    /// 队伍列表响应
    /// </summary>
    [Serializable]
    public class TeamListResponse
    {
        public Team[] teams = Array.Empty<Team>();
    }

    /// <summary>
    /// 队伍状态响应
    /// </summary>
    [Serializable]
    public class TeamStatusResponse
    {
        public bool canStart;
        public bool allTeamsFull;  // 新增：是否所有队伍已满
        public TeamStatusInfo[] teams = Array.Empty<TeamStatusInfo>();
        public string message = string.Empty;
    }

    /// <summary>
    /// 分配玩家到队伍请求
    /// </summary>
    [Serializable]
    public class AssignPlayerRequest
    {
        public string playerId = string.Empty;
        public string teamId = string.Empty;  // 新增：队伍 ID
    }

    /// <summary>
    /// 代码统计响应
    /// </summary>
    [Serializable]
    public class CodeStatisticsResponse
    {
        public int totalCodes;
        public int usedCodes;
        public int availableCodes;  // 可用代码数 = totalCodes - usedCodes
    }

    /// <summary>
    /// 更新房间状态请求
    /// </summary>
    [Serializable]
    public class UpdateRoomStatusRequest
    {
        public string playerId = string.Empty;
        public string status = string.Empty;
    }
}
