using Basis.Network.Core;

namespace BasisNetworkCore.Serializable
{
    public static partial class SerializableBasis
    {
        public struct AdminRequest
        {
            private byte messageIndex;
            public AdminRequestMode GetAdminRequestMode()
            {
                return (AdminRequestMode)messageIndex;
            }
            public void Deserialize(NetDataReader reader)
            {
                int bytesAvailable = reader.AvailableBytes;
                if (bytesAvailable > 0)
                {
                    messageIndex = reader.GetByte();
                }
                else
                {
                    BNL.LogError($"Unable to read remaining bytes, available: {bytesAvailable}");
                }
            }

            public void Serialize(NetDataWriter writer, AdminRequestMode AdminRequestMode)
            {
                messageIndex = (byte)AdminRequestMode;
                writer.Put(messageIndex);
            }
        }
        public enum AdminRequestMode : byte
        {
            Ban,//bans a player
            Kick,//kicks a player
            IpAndBan,// bans and ip bans a player
            Message,// sends a message to a user
            MessageAll,// sends a message to all users
            UnBanIP,// unbans a user and unbans a associated ip
            UnBan,// unbans a user
          //  RequestBannedPlayers,// gets a list of banned players
           // TeleportTo,// teleport to a player
            TeleportAll,// teleports everyone
            TeleportPlayer,

            // Permission management (any user can request, only admins can modify)
            GetPermissions,     // request full permission snapshot (read-only for non-admins)
            SetUserGroup,       // admin: add/remove user from a group
            SetUserNode,        // admin: add/remove permission node from a user
            SetGroupNode,       // admin: add/remove permission node from a group
            CreateGroup,        // admin: create a new permission group
            DeleteGroup,        // admin: delete a permission group
            SetGroupParent,     // admin: add/remove a parent group from a group

            EnableShoutMode,    // admin: enable shout mode for a player (non-spatialized broadcast voice)
            DisableShoutMode,   // admin: disable shout mode for a player

            GlobalToggleAvatars, // admin: toggle global avatar loading lock
            GlobalToggleProps,   // admin: toggle global prop loading lock
            GlobalToggleWorlds,  // admin: toggle global world loading lock
            GlobalGetLockState,  // server→client: current global lock state
            GlobalGetHeadlessAudioState, // server→client: current global headless audio state
            SetGlobalHeadlessAudio, // admin: explicitly set headless audio clip playback state for headless clients
            GlobalGetHeadlessDisallowState, // server→client: current global headless disallow state
            SetGlobalHeadlessDisallow, // admin: explicitly allow/disallow headless client connections
            SetGlobalOpusPacketLoss, // admin: set Opus FEC packet-loss percent (0..100) applied to every client's encoder
            GlobalGetOpusPacketLossState, // server→client: current Opus FEC packet-loss percent

            SetUserOpusBitrate,           // admin: override a single user's Opus encoder bitrate (bps); 0 = clear override
            UserOpusBitrateOverride,      // server→target user: their current bitrate override (0 = none)
            SetGlobalOpusFrameDuration,   // admin: set the Opus frame duration in milliseconds (20 or 40)
            GlobalGetOpusFrameDurationState, // server→client: current Opus frame duration in milliseconds

            // ── Server config / whitelist (persisted to disk) ─────────────────
            SetServerName,    // admin: set Configuration.ServerName + persist to config.xml. Payload: [string name]
            SetServerMotd,    // admin: set Configuration.ServerMotd + persist to config.xml. Payload: [string motd]
            SetWhitelistMode, // admin: set Configuration.BasisUserRestrictionMode + persist. Payload: [byte BasisUserRestrictionMode]
            AddWhitelist,     // admin: add UUID to BasisWhiteList.txt. Payload: [string uuid]
            RemoveWhitelist,  // admin: remove UUID from BasisWhiteList.txt. Payload: [string uuid]

            GlobalToggleServers, // admin: toggle global server-share lock (BasisGlobalLockManager.ServersLocked).

            GlobalToggleThirdPerson, // admin: toggle the global third-person camera disable (BasisGlobalLockManager.ThirdPersonDisabled). State is appended as the 5th bool in GlobalGetLockState.

            // ── Default library (server-pushed library items, persisted to disk) ──
            // Payload: [byte mode (0=Avatar,1=World,2=Prop)][string url][string password]
            // Gated by PermNodes.ConfigurationEditor. Writes a new XML file under the
            // server's defaultlibrary/ folder and rebroadcasts the updated list.
            AddDefaultLibraryItem,

            // Payload: [string url]
            // Removes every defaultlibrary/ XML whose URL matches and rebroadcasts.
            RemoveDefaultLibraryItem,

            // admin: toggle the global strip of AdditionalAvatarDatas (blendshapes,
            // custom-behaviour params) on inbound avatar sync messages. Muscle/position/
            // rotation still propagate normally. State is appended as the 6th bool in
            // GlobalGetLockState.
            GlobalToggleAdditionalAvatarDataLock,

            // admin: set the per-category camera photo-metadata disallow mask (1 byte).
            // Each set bit disallows one embedding category for all clients; 0 = all allowed.
            // The current mask is appended as a trailing byte in GlobalGetLockState.
            SetGlobalCameraPolicy,
        }
    }
}
