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

namespace IGP.UnitySDK.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 createdAt = string.Empty;
        public string updatedAt = string.Empty;
        public string mapPublicId = string.Empty;
        public int? mapVersionId;

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

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

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

    [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;
    }

    /// <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 Dictionary<string, object> state = new Dictionary<string, object>();
        public string lastSeen = string.Empty;
        public string disconnectedAt = string.Empty;
    }

    /// <summary>
    /// 加入房间响应（包含房间和玩家信息）
    /// </summary>
    [Serializable]
    public class JoinRoomResponse
    {
        public bool success;
        public Room room = new Room();
        public Player player = new Player();
        public string token = string.Empty;
    }

    /// <summary>
    /// 启动票据兑换响应
    /// </summary>
    [Serializable]
    public 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;
        public int? reliableMessageMaxBytes;
        public int? reliableChunkMaxBytes;
        public int? kcpDataPlanePayloadMaxBytes;
        public int? kcpFrameMaxBytes;
    }

    /// <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 bool autoConnect = true;
        public int? appId;
    }

    /// <summary>
    /// IGP 成就上报结果
    /// </summary>
    [Serializable]
    public class AchievementReportResult
    {
        public bool success;
        public bool duplicated;
        public string message = string.Empty;
    }

    /// <summary>
    /// IGP 成就清除结果
    /// </summary>
    [Serializable]
    public class AchievementClearResult
    {
        public bool success;
        public int deletedCount;
        public string message = string.Empty;
    }

    /// <summary>
    /// 创建房间请求
    /// </summary>
    [Serializable]
    public class CreateRoomRequest
    {
        public string name = string.Empty;
        public int maxPlayers = 4;
        public TeamConfig[] teamConfigs = Array.Empty<TeamConfig>();
    }

    /// <summary>
    /// 创建房间响应
    /// </summary>
    [Serializable]
    public class CreateRoomResponse
    {
        public string roomId = string.Empty;
        public string roomCode = string.Empty;
        public string status = string.Empty;
        public Team[] teams = Array.Empty<Team>();
    }

    /// <summary>
    /// 加入房间请求
    /// </summary>
    [Serializable]
    public class JoinRoomRequest
    {
        public string playerId = string.Empty;
        public string playerName = string.Empty;
        public string color = string.Empty;
        public string avatar = string.Empty;
        public int avatarIndex = 0;
    }

    /// <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 playerCount;
    }

    /// <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;
    }

    /// <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>
    /// RPC 调用响应数据
    /// </summary>
    [Serializable]
    public class RPCCallResponseData
    {
        public string requestId = string.Empty;  // 新增：请求 ID，用于关联请求和响应
        public string name = string.Empty;
        public object? data;
        public string error = string.Empty;
    }

    /// <summary>
    /// RPC 响应消息
    /// </summary>
    [Serializable]
    public class RPCCallResponse
    {
        public bool success;  // 新增：成功标识
        public RPCCallResponseData data = new RPCCallResponseData();
    }

    /// <summary>
    /// 房间列表响应
    /// </summary>
    [Serializable]
    public class IGPRoomListResponse
    {
        public Room[] rooms = Array.Empty<Room>();
        public int total;
        public int page;
        public int pageSize;
    }

    /// <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;
    }
}
