using System;
using System.Collections.Generic;
using MemoryPack;
using Newtonsoft.Json;

namespace Com.Project.B.Lobby
{
    /// <summary>
    /// 大厅授权
    /// </summary>
    public enum LobbyAccessMode
    {
        /// <summary>
        /// 私密大厅
        /// </summary>
        Private,
        /// <summary>
        /// 公开,可被搜索到
        /// </summary>
        Public,
        /// <summary>
        /// 仅好友可见
        /// </summary>
        FriendsOnly,
        /// <summary>
        /// 仅邀请可见
        /// </summary>
        InviteOnly,
        /// <summary>
        /// 好友和邀请
        /// </summary>
        FriendAndInvite,
    }
    /// <summary>
    /// 大厅数据
    /// </summary>
    public interface ILobbyData
    {
        /// <summary>
        /// 大厅ID,通常是玩家ID
        /// </summary>
        public Guid Id { get; }
        /// <summary>
        /// 开放模式
        /// </summary>
        LobbyAccessMode LobbyAccess { get; }
        /// <summary>
        /// 选择的场景
        /// </summary>
        public string Map { get; }
        /// <summary>
        /// 大厅名称
        /// </summary>
        public string Name { get; }
        /// <summary>
        /// 描述
        /// </summary>
        public string Description { get; }
        /// <summary>
        /// 主机ID,通常是玩家ID
        /// </summary>
        public Guid HostId { get; }
        /// <summary>
        /// 玩家ID
        /// </summary>
        public Guid[] PlayerIds { get; }

        public bool Contain(Guid player);
    }
    [MemoryPackable]
    public sealed partial class LobbyData:ILobbyData
    {
        public Guid Id { get; set; }
        public LobbyAccessMode LobbyAccess { get; set; } = LobbyAccessMode.Public;
        public string Map { get; set; }
        public string Name { get; set; } = "Project B Lobby";
        public string Description { get; set; }="Welcome";
        public Guid HostId { get; set; }
        [JsonIgnore]
        Guid[] ILobbyData.PlayerIds=>Players.ToArray();

        public bool Contain(Guid player)
        {
            return Players.Contains(player) || HostId == player;
        }

        public List<Guid> Players = new();
    }
}