/*
 *  This file is part of CounterStrikeSharp.
 *  CounterStrikeSharp is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  CounterStrikeSharp is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with CounterStrikeSharp.  If not, see <https://www.gnu.org/licenses/>. *
 */

using System;
using System.Collections.Generic;
using System.Text;

namespace CounterStrikeSharp.API
{
    [Flags]
    public enum ConVarFlags : Int64
    {
        FCVAR_NONE = 0,
        FCVAR_LINKED_CONCOMMAND = (1 << 0),

        FCVAR_DEVELOPMENTONLY =
            (1 << 1), // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined.
        FCVAR_GAMEDLL = (1 << 2), // defined by the game DLL
        FCVAR_CLIENTDLL = (1 << 3), // defined by the client DLL

        FCVAR_HIDDEN =
            (1 << 4), // Hidden. Doesn't appear in find or auto complete. Like DEVELOPMENTONLY, but can't be compiled out.

        // ConVar only
        FCVAR_PROTECTED =
            (1 << 5), // It's a server cvar, but we don't send the data since it's a password, etc.  Sends 1 if it's not bland/zero, 0 otherwise as value
        FCVAR_SPONLY = (1 << 6), // This cvar cannot be changed by clients connected to a multiplayer server.
        FCVAR_ARCHIVE = (1 << 7), // set to cause it to be saved to vars.rc
        FCVAR_NOTIFY = (1 << 8), // notifies players when changed
        FCVAR_USERINFO = (1 << 9), // changes the client's info string
        FCVAR_MISSING0 = (1 << 10), // Something that hides the cvar from the cvar lookups

        FCVAR_UNLOGGED =
            (1 << 11), // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log
        FCVAR_MISSING1 = (1 << 12), // Something that hides the cvar from the cvar lookups
        FCVAR_REPLICATED = (1 << 13), // server setting enforced on clients, TODO rename to FCAR_SERVER at some time
        FCVAR_CHEAT = (1 << 14), // Only useable in singleplayer / debug / multiplayer & sv_cheats

        FCVAR_PER_USER =
            (1 << 15), // causes varnameN where N == 2 through max splitscreen slots for mod to be autogenerated
        FCVAR_DEMO = (1 << 16), // record this cvar when starting a demo file
        FCVAR_DONTRECORD = (1 << 17), // don't record these command in demofiles
        FCVAR_MISSING2 = (1 << 18),
        FCVAR_RELEASE = (1 << 19), // Cvars tagged with this are the only cvars avaliable to customers
        FCVAR_MENUBAR_ITEM = (1 << 20),
        FCVAR_MISSING3 = (1 << 21),
        FCVAR_NOT_CONNECTED = (1 << 22), // cvar cannot be changed by a client that is connected to a server
        FCVAR_VCONSOLE_FUZZY_MATCHING = (1 << 23),

        FCVAR_SERVER_CAN_EXECUTE =
            (1 << 24), // the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd.
        FCVAR_CLIENT_CAN_EXECUTE = (1 << 25), // Assigned to commands to let clients execute them

        FCVAR_SERVER_CANNOT_QUERY =
            (1 << 26), // If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue).
        FCVAR_VCONSOLE_SET_FOCUS = (1 << 27),
        FCVAR_CLIENTCMD_CAN_EXECUTE = (1 << 28), // IVEngineClient::ClientCmd is allowed to execute this command. 
        FCVAR_EXECUTE_PER_TICK = (1 << 29),
    }

    public enum ConVarType
    {
        Invalid = -1,
        Bool,
        Int16,
        UInt16,
        Int32,
        UInt32,
        Int64,
        UInt64,
        Float32,
        Float64,
        String,
        Color,
        Vector2,
        Vector3,
        Vector4,
        Qangle
    }

    public enum ConCommandFlags
    {
        FCVAR_LINKED_CONCOMMAND = (1 << 0),

        FCVAR_DEVELOPMENTONLY =
            (1 << 1), // Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined.
        FCVAR_GAMEDLL = (1 << 2), // defined by the game DLL
        FCVAR_CLIENTDLL = (1 << 3), // defined by the client DLL
    }
}