package redis

type RedisType string
type RedisCommand string
type RedisKeyword string

var types map[rune]RedisType = map[rune]RedisType{
	plusByte:          "Simple String",
	dollarByte:        "Bulk String",
	asteriskByte:      "Array",
	colonByte:         "Integer",
	minusByte:         "Error",
	notApplicableByte: "N/A",
}

var commands []RedisCommand = []RedisCommand{
	"PING",
	"SET",
	"GET",
	"QUIT",
	"EXISTS",
	"DEL",
	"UNLINK",
	"TYPE",
	"FLUSHDB",
	"KEYS",
	"RANDOMKEY",
	"RENAME",
	"RENAMENX",
	"RENAMEX",
	"DBSIZE",
	"EXPIRE",
	"EXPIREAT",
	"TTL",
	"SELECT",
	"MOVE",
	"FLUSHALL",
	"GETSET",
	"MGET",
	"SETNX",
	"SETEX",
	"MSET",
	"MSETNX",
	"DECRBY",
	"DECR",
	"INCRBY",
	"INCR",
	"APPEND",
	"SUBSTR",
	"HSET",
	"HGET",
	"HSETNX",
	"HMSET",
	"HMGET",
	"HINCRBY",
	"HEXISTS",
	"HDEL",
	"HLEN",
	"HKEYS",
	"HVALS",
	"HGETALL",
	"RPUSH",
	"LPUSH",
	"LLEN",
	"LRANGE",
	"LTRIM",
	"LINDEX",
	"LSET",
	"LREM",
	"LPOP",
	"RPOP",
	"RPOPLPUSH",
	"SADD",
	"SMEMBERS",
	"SREM",
	"SPOP",
	"SMOVE",
	"SCARD",
	"SISMEMBER",
	"SINTER",
	"SINTERSTORE",
	"SUNION",
	"SUNIONSTORE",
	"SDIFF",
	"SDIFFSTORE",
	"SRANDMEMBER",
	"ZADD",
	"ZRANGE",
	"ZREM",
	"ZINCRBY",
	"ZRANK",
	"ZREVRANK",
	"ZREVRANGE",
	"ZCARD",
	"ZSCORE",
	"MULTI",
	"DISCARD",
	"EXEC",
	"WATCH",
	"UNWATCH",
	"SORT",
	"BLPOP",
	"BRPOP",
	"AUTH",
	"SUBSCRIBE",
	"PUBLISH",
	"UNSUBSCRIBE",
	"PSUBSCRIBE",
	"PUNSUBSCRIBE",
	"PUBSUB",
	"ZCOUNT",
	"ZRANGEBYSCORE",
	"ZREVRANGEBYSCORE",
	"ZREMRANGEBYRANK",
	"ZREMRANGEBYSCORE",
	"ZUNIONSTORE",
	"ZINTERSTORE",
	"ZLEXCOUNT",
	"ZRANGEBYLEX",
	"ZREVRANGEBYLEX",
	"ZREMRANGEBYLEX",
	"SAVE",
	"BGSAVE",
	"BGREWRITEAOF",
	"LASTSAVE",
	"SHUTDOWN",
	"INFO",
	"MONITOR",
	"SLAVEOF",
	"CONFIG",
	"STRLEN",
	"SYNC",
	"LPUSHX",
	"PERSIST",
	"RPUSHX",
	"ECHO",
	"LINSERT",
	"DEBUG",
	"BRPOPLPUSH",
	"SETBIT",
	"GETBIT",
	"BITPOS",
	"SETRANGE",
	"GETRANGE",
	"EVAL",
	"EVALSHA",
	"SCRIPT",
	"SLOWLOG",
	"OBJECT",
	"BITCOUNT",
	"BITOP",
	"SENTINEL",
	"DUMP",
	"RESTORE",
	"PEXPIRE",
	"PEXPIREAT",
	"PTTL",
	"INCRBYFLOAT",
	"PSETEX",
	"CLIENT",
	"TIME",
	"MIGRATE",
	"HINCRBYFLOAT",
	"SCAN",
	"HSCAN",
	"SSCAN",
	"ZSCAN",
	"WAIT",
	"CLUSTER",
	"ASKING",
	"PFADD",
	"PFCOUNT",
	"PFMERGE",
	"READONLY",
	"GEOADD",
	"GEODIST",
	"GEOHASH",
	"GEOPOS",
	"GEORADIUS",
	"GEORADIUS_RO",
	"GEORADIUSBYMEMBER",
	"GEORADIUSBYMEMBER_RO",
	"MODULE",
	"BITFIELD",
	"HSTRLEN",
	"TOUCH",
	"SWAPDB",
	"MEMORY",
	"XADD",
	"XLEN",
	"XDEL",
	"XTRIM",
	"XRANGE",
	"XREVRANGE",
	"XREAD",
	"XACK",
	"XGROUP",
	"XREADGROUP",
	"XPENDING",
	"XCLAIM",
}

var keywords []RedisKeyword = []RedisKeyword{
	"AGGREGATE",
	"ALPHA",
	"ASC",
	"BY",
	"DESC",
	"GET",
	"LIMIT",
	"MESSAGE",
	"NO",
	"NOSORT",
	"PMESSAGE",
	"PSUBSCRIBE",
	"PUNSUBSCRIBE",
	"OK",
	"ONE",
	"QUEUED",
	"SET",
	"STORE",
	"SUBSCRIBE",
	"UNSUBSCRIBE",
	"WEIGHTS",
	"WITHSCORES",
	"RESETSTAT",
	"REWRITE",
	"RESET",
	"FLUSH",
	"EXISTS",
	"LOAD",
	"KILL",
	"LEN",
	"REFCOUNT",
	"ENCODING",
	"IDLETIME",
	"GETNAME",
	"SETNAME",
	"LIST",
	"MATCH",
	"COUNT",
	"PING",
	"PONG",
	"UNLOAD",
	"REPLACE",
	"KEYS",
	"PAUSE",
	"DOCTOR",
	"BLOCK",
	"NOACK",
	"STREAMS",
	"KEY",
	"CREATE",
	"MKSTREAM",
	"SETID",
	"DESTROY",
	"DELCONSUMER",
	"MAXLEN",
	"GROUP",
	"IDLE",
	"TIME",
	"RETRYCOUNT",
	"FORCE",
}

type RedisPacket struct {
	Type    RedisType    `json:"type"`
	Command RedisCommand `json:"command"`
	Key     string       `json:"key"`
	Value   string       `json:"value"`
	Keyword RedisKeyword `json:"keyword"`
}

func isValidRedisCommand(s []RedisCommand, c RedisCommand) bool {
	for _, v := range s {
		if v == c {
			return true
		}
	}
	return false
}

func isValidRedisKeyword(s []RedisKeyword, c RedisKeyword) bool {
	for _, v := range s {
		if v == c {
			return true
		}
	}
	return false
}
