/*
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional information regarding
 * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License. You may obtain a
 * copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package org.apache.geode.redis.internal;

import static org.apache.geode.redis.internal.RedisCommandSupportLevel.INTERNAL;
import static org.apache.geode.redis.internal.RedisCommandSupportLevel.SUPPORTED;
import static org.apache.geode.redis.internal.RedisCommandSupportLevel.UNIMPLEMENTED;
import static org.apache.geode.redis.internal.RedisCommandSupportLevel.UNSUPPORTED;
import static org.apache.geode.redis.internal.RedisConstants.ERROR_SYNTAX;

import org.apache.geode.redis.internal.ParameterRequirements.EvenParameterRequirements;
import org.apache.geode.redis.internal.ParameterRequirements.ExactParameterRequirements;
import org.apache.geode.redis.internal.ParameterRequirements.MaximumParameterRequirements;
import org.apache.geode.redis.internal.ParameterRequirements.MinimumParameterRequirements;
import org.apache.geode.redis.internal.ParameterRequirements.OddParameterRequirements;
import org.apache.geode.redis.internal.ParameterRequirements.ParameterRequirements;
import org.apache.geode.redis.internal.ParameterRequirements.SlowlogParameterRequirements;
import org.apache.geode.redis.internal.ParameterRequirements.SpopParameterRequirements;
import org.apache.geode.redis.internal.ParameterRequirements.UnspecifiedParameterRequirements;
import org.apache.geode.redis.internal.executor.Executor;
import org.apache.geode.redis.internal.executor.RedisResponse;
import org.apache.geode.redis.internal.executor.UnknownExecutor;
import org.apache.geode.redis.internal.executor.connection.AuthExecutor;
import org.apache.geode.redis.internal.executor.connection.EchoExecutor;
import org.apache.geode.redis.internal.executor.connection.PingExecutor;
import org.apache.geode.redis.internal.executor.connection.QuitExecutor;
import org.apache.geode.redis.internal.executor.connection.SelectExecutor;
import org.apache.geode.redis.internal.executor.hash.HDelExecutor;
import org.apache.geode.redis.internal.executor.hash.HExistsExecutor;
import org.apache.geode.redis.internal.executor.hash.HGetAllExecutor;
import org.apache.geode.redis.internal.executor.hash.HGetExecutor;
import org.apache.geode.redis.internal.executor.hash.HIncrByExecutor;
import org.apache.geode.redis.internal.executor.hash.HIncrByFloatExecutor;
import org.apache.geode.redis.internal.executor.hash.HKeysExecutor;
import org.apache.geode.redis.internal.executor.hash.HLenExecutor;
import org.apache.geode.redis.internal.executor.hash.HMGetExecutor;
import org.apache.geode.redis.internal.executor.hash.HMSetExecutor;
import org.apache.geode.redis.internal.executor.hash.HScanExecutor;
import org.apache.geode.redis.internal.executor.hash.HSetExecutor;
import org.apache.geode.redis.internal.executor.hash.HSetNXExecutor;
import org.apache.geode.redis.internal.executor.hash.HStrLenExecutor;
import org.apache.geode.redis.internal.executor.hash.HValsExecutor;
import org.apache.geode.redis.internal.executor.key.DelExecutor;
import org.apache.geode.redis.internal.executor.key.ExistsExecutor;
import org.apache.geode.redis.internal.executor.key.ExpireAtExecutor;
import org.apache.geode.redis.internal.executor.key.ExpireExecutor;
import org.apache.geode.redis.internal.executor.key.KeysExecutor;
import org.apache.geode.redis.internal.executor.key.PExpireAtExecutor;
import org.apache.geode.redis.internal.executor.key.PExpireExecutor;
import org.apache.geode.redis.internal.executor.key.PTTLExecutor;
import org.apache.geode.redis.internal.executor.key.PersistExecutor;
import org.apache.geode.redis.internal.executor.key.RenameExecutor;
import org.apache.geode.redis.internal.executor.key.ScanExecutor;
import org.apache.geode.redis.internal.executor.key.TTLExecutor;
import org.apache.geode.redis.internal.executor.key.TypeExecutor;
import org.apache.geode.redis.internal.executor.pubsub.PsubscribeExecutor;
import org.apache.geode.redis.internal.executor.pubsub.PublishExecutor;
import org.apache.geode.redis.internal.executor.pubsub.PunsubscribeExecutor;
import org.apache.geode.redis.internal.executor.pubsub.SubscribeExecutor;
import org.apache.geode.redis.internal.executor.pubsub.UnsubscribeExecutor;
import org.apache.geode.redis.internal.executor.server.DBSizeExecutor;
import org.apache.geode.redis.internal.executor.server.FlushAllExecutor;
import org.apache.geode.redis.internal.executor.server.InfoExecutor;
import org.apache.geode.redis.internal.executor.server.ShutDownExecutor;
import org.apache.geode.redis.internal.executor.server.SlowlogExecutor;
import org.apache.geode.redis.internal.executor.server.TimeExecutor;
import org.apache.geode.redis.internal.executor.set.SAddExecutor;
import org.apache.geode.redis.internal.executor.set.SCardExecutor;
import org.apache.geode.redis.internal.executor.set.SDiffExecutor;
import org.apache.geode.redis.internal.executor.set.SDiffStoreExecutor;
import org.apache.geode.redis.internal.executor.set.SInterExecutor;
import org.apache.geode.redis.internal.executor.set.SInterStoreExecutor;
import org.apache.geode.redis.internal.executor.set.SIsMemberExecutor;
import org.apache.geode.redis.internal.executor.set.SMembersExecutor;
import org.apache.geode.redis.internal.executor.set.SMoveExecutor;
import org.apache.geode.redis.internal.executor.set.SPopExecutor;
import org.apache.geode.redis.internal.executor.set.SRandMemberExecutor;
import org.apache.geode.redis.internal.executor.set.SRemExecutor;
import org.apache.geode.redis.internal.executor.set.SScanExecutor;
import org.apache.geode.redis.internal.executor.set.SUnionExecutor;
import org.apache.geode.redis.internal.executor.set.SUnionStoreExecutor;
import org.apache.geode.redis.internal.executor.string.AppendExecutor;
import org.apache.geode.redis.internal.executor.string.BitCountExecutor;
import org.apache.geode.redis.internal.executor.string.BitOpExecutor;
import org.apache.geode.redis.internal.executor.string.BitPosExecutor;
import org.apache.geode.redis.internal.executor.string.DecrByExecutor;
import org.apache.geode.redis.internal.executor.string.DecrExecutor;
import org.apache.geode.redis.internal.executor.string.GetBitExecutor;
import org.apache.geode.redis.internal.executor.string.GetExecutor;
import org.apache.geode.redis.internal.executor.string.GetRangeExecutor;
import org.apache.geode.redis.internal.executor.string.GetSetExecutor;
import org.apache.geode.redis.internal.executor.string.IncrByExecutor;
import org.apache.geode.redis.internal.executor.string.IncrByFloatExecutor;
import org.apache.geode.redis.internal.executor.string.IncrExecutor;
import org.apache.geode.redis.internal.executor.string.MGetExecutor;
import org.apache.geode.redis.internal.executor.string.MSetExecutor;
import org.apache.geode.redis.internal.executor.string.MSetNXExecutor;
import org.apache.geode.redis.internal.executor.string.PSetEXExecutor;
import org.apache.geode.redis.internal.executor.string.SetBitExecutor;
import org.apache.geode.redis.internal.executor.string.SetEXExecutor;
import org.apache.geode.redis.internal.executor.string.SetExecutor;
import org.apache.geode.redis.internal.executor.string.SetNXExecutor;
import org.apache.geode.redis.internal.executor.string.SetRangeExecutor;
import org.apache.geode.redis.internal.executor.string.StrlenExecutor;
import org.apache.geode.redis.internal.netty.Command;
import org.apache.geode.redis.internal.netty.ExecutionHandlerContext;

/**
 * The redis command type used by the server. Each command is directly from the redis protocol.
 */
public enum RedisCommandType {

  /***************************************
   *** Supported Commands ***
   ***************************************/

  /*************** Connection ****************/
  AUTH(new AuthExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
  PING(new PingExecutor(), SUPPORTED, new MaximumParameterRequirements(2)),
  QUIT(new QuitExecutor(), SUPPORTED),

  /*************** Keys ******************/

  DEL(new DelExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
  EXISTS(new ExistsExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
  EXPIRE(new ExpireExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
  EXPIREAT(new ExpireAtExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
  KEYS(new KeysExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
  PERSIST(new PersistExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
  PEXPIRE(new PExpireExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
  PEXPIREAT(new PExpireAtExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
  PTTL(new PTTLExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
  RENAME(new RenameExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
  TTL(new TTLExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
  TYPE(new TypeExecutor(), SUPPORTED, new ExactParameterRequirements(2)),

  /************* Strings *****************/

  APPEND(new AppendExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
  GET(new GetExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
  SET(new SetExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),

  /************* Hashes *****************/

  HGETALL(new HGetAllExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
  HMSET(new HMSetExecutor(), SUPPORTED,
      new MinimumParameterRequirements(4).and(new EvenParameterRequirements())),
  HSET(new HSetExecutor(), SUPPORTED,
      new MinimumParameterRequirements(4).and(new EvenParameterRequirements())),
  HVALS(new HValsExecutor(), SUPPORTED, new ExactParameterRequirements(2)),

  /************* Sets *****************/

  SADD(new SAddExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),
  SMEMBERS(new SMembersExecutor(), SUPPORTED, new ExactParameterRequirements(2)),
  SREM(new SRemExecutor(), SUPPORTED, new MinimumParameterRequirements(3)),

  /********** Publish Subscribe **********/
  SUBSCRIBE(new SubscribeExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
  PUBLISH(new PublishExecutor(), SUPPORTED, new ExactParameterRequirements(3)),
  PSUBSCRIBE(new PsubscribeExecutor(), SUPPORTED, new MinimumParameterRequirements(2)),
  PUNSUBSCRIBE(new PunsubscribeExecutor(), SUPPORTED, new MinimumParameterRequirements(1)),
  UNSUBSCRIBE(new UnsubscribeExecutor(), SUPPORTED, new MinimumParameterRequirements(1)),

  /***************************************
   ********** Internal Commands **********
   * /
   ***************************************/
  // do not call these directly, only to be used in other commands
  INTERNALPTTL(null, INTERNAL, new ExactParameterRequirements(2)),
  INTERNALSMEMBERS(null, INTERNAL, new ExactParameterRequirements(3)),

  /***************************************
   *** Unsupported Commands ***
   ***************************************/

  /***************************************
   *************** Connection *************
   ***************************************/

  ECHO(new EchoExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
  SELECT(new SelectExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),

  /***************************************
   *************** Keys ******************
   ***************************************/

  SCAN(new ScanExecutor(), UNSUPPORTED, new EvenParameterRequirements(ERROR_SYNTAX).and(new MinimumParameterRequirements(2))),
  UNLINK(new DelExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),

  /***************************************
   ************** Strings ****************
   ***************************************/

  BITCOUNT(new BitCountExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
  BITOP(new BitOpExecutor(), UNSUPPORTED, new MinimumParameterRequirements(4)),
  BITPOS(new BitPosExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3)),
  DECR(new DecrExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
  DECRBY(new DecrByExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  GETBIT(new GetBitExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  GETRANGE(new GetRangeExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  GETSET(new GetSetExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  INCR(new IncrExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
  INCRBY(new IncrByExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  INCRBYFLOAT(new IncrByFloatExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  MGET(new MGetExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
  MSET(new MSetExecutor(), UNSUPPORTED,
      new MinimumParameterRequirements(3).and(new OddParameterRequirements())),
  MSETNX(new MSetNXExecutor(), UNSUPPORTED,
      new MinimumParameterRequirements(3).and(new OddParameterRequirements())),
  PSETEX(new PSetEXExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  SETBIT(new SetBitExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  SETEX(new SetEXExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  SETNX(new SetNXExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  SETRANGE(new SetRangeExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  STRLEN(new StrlenExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),

  /***************************************
   **************** Hashes ***************
   ***************************************/

  HDEL(new HDelExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3)),
  HEXISTS(new HExistsExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  HGET(new HGetExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  HINCRBY(new HIncrByExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  HINCRBYFLOAT(new HIncrByFloatExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  HKEYS(new HKeysExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
  HLEN(new HLenExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
  HMGET(new HMGetExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3)),
  HSCAN(new HScanExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3),
      new OddParameterRequirements(ERROR_SYNTAX)),
  HSETNX(new HSetNXExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  HSTRLEN(new HStrLenExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),

  /***************************************
   **************** Sets *****************
   ***************************************/

  SCARD(new SCardExecutor(), UNSUPPORTED, new ExactParameterRequirements(2)),
  SDIFF(new SDiffExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
  SDIFFSTORE(new SDiffStoreExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3)),
  SINTER(new SInterExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
  SINTERSTORE(new SInterStoreExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3)),
  SISMEMBER(new SIsMemberExecutor(), UNSUPPORTED, new ExactParameterRequirements(3)),
  SMOVE(new SMoveExecutor(), UNSUPPORTED, new ExactParameterRequirements(4)),
  SPOP(new SPopExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)
      .and(new MaximumParameterRequirements(3, ERROR_SYNTAX)).and(new SpopParameterRequirements())),
  SRANDMEMBER(new SRandMemberExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
  SSCAN(new SScanExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3),
      new OddParameterRequirements(ERROR_SYNTAX)),
  SUNION(new SUnionExecutor(), UNSUPPORTED, new MinimumParameterRequirements(2)),
  SUNIONSTORE(new SUnionStoreExecutor(), UNSUPPORTED, new MinimumParameterRequirements(3)),

  /***************************************
   *************** Server ****************
   ***************************************/

  DBSIZE(new DBSizeExecutor(), UNSUPPORTED, new ExactParameterRequirements(1)),
  FLUSHALL(new FlushAllExecutor(), UNSUPPORTED, new MaximumParameterRequirements(2, ERROR_SYNTAX)),
  FLUSHDB(new FlushAllExecutor(), UNSUPPORTED, new MaximumParameterRequirements(2, ERROR_SYNTAX)),
  INFO(new InfoExecutor(), UNSUPPORTED, new MaximumParameterRequirements(2, ERROR_SYNTAX)),
  SHUTDOWN(new ShutDownExecutor(), UNSUPPORTED, new MaximumParameterRequirements(2, ERROR_SYNTAX)),
  SLOWLOG(new SlowlogExecutor(), UNSUPPORTED, new SlowlogParameterRequirements()),
  TIME(new TimeExecutor(), UNSUPPORTED, new ExactParameterRequirements(1)),

  /////////// UNIMPLEMENTED /////////////////////

  ACL(null, UNIMPLEMENTED),
  BGREWRITEAOF(null, UNIMPLEMENTED),
  BGSAVE(null, UNIMPLEMENTED),
  BITFIELD(null, UNIMPLEMENTED),
  BLPOP(null, UNIMPLEMENTED),
  BRPOP(null, UNIMPLEMENTED),
  BRPOPLPUSH(null, UNIMPLEMENTED),
  BZPOPMIN(null, UNIMPLEMENTED),
  BZPOPMAX(null, UNIMPLEMENTED),
  CLIENT(null, UNIMPLEMENTED),
  CLUSTER(null, UNIMPLEMENTED),
  COMMAND(null, UNIMPLEMENTED),
  CONFIG(null, UNIMPLEMENTED),
  DEBUG(null, UNIMPLEMENTED),
  DISCARD(null, UNIMPLEMENTED),
  DUMP(null, UNIMPLEMENTED),
  EVAL(null, UNIMPLEMENTED),
  EVALSHA(null, UNIMPLEMENTED),
  EXEC(null, UNIMPLEMENTED),
  GEOADD(null, UNIMPLEMENTED),
  GEOHASH(null, UNIMPLEMENTED),
  GEOPOS(null, UNIMPLEMENTED),
  GEODIST(null, UNIMPLEMENTED),
  GEORADIUS(null, UNIMPLEMENTED),
  GEORADIUSBYMEMBER(null, UNIMPLEMENTED),
  LATENCY(null, UNIMPLEMENTED),
  LASTSAVE(null, UNIMPLEMENTED),
  LINDEX(null, UNIMPLEMENTED),
  LINSERT(null, UNIMPLEMENTED),
  LLEN(null, UNIMPLEMENTED),
  LOLWUT(null, UNIMPLEMENTED),
  LPOP(null, UNIMPLEMENTED),
  LPUSH(null, UNIMPLEMENTED),
  LPUSHX(null, UNIMPLEMENTED),
  LRANGE(null, UNIMPLEMENTED),
  LREM(null, UNIMPLEMENTED),
  LSET(null, UNIMPLEMENTED),
  LTRIM(null, UNIMPLEMENTED),
  MEMORY(null, UNIMPLEMENTED),
  MIGRATE(null, UNIMPLEMENTED),
  MODULE(null, UNIMPLEMENTED),
  MONITOR(null, UNIMPLEMENTED),
  MOVE(null, UNIMPLEMENTED),
  MULTI(null, UNIMPLEMENTED),
  OBJECT(null, UNIMPLEMENTED),
  PFADD(null, UNIMPLEMENTED),
  PFCOUNT(null, UNIMPLEMENTED),
  PFMERGE(null, UNIMPLEMENTED),
  PSYNC(null, UNIMPLEMENTED),
  PUBSUB(null, UNIMPLEMENTED),
  RANDOMKEY(null, UNIMPLEMENTED),
  READONLY(null, UNIMPLEMENTED),
  READWRITE(null, UNIMPLEMENTED),
  RENAMENX(null, UNIMPLEMENTED),
  RESTORE(null, UNIMPLEMENTED),
  ROLE(null, UNIMPLEMENTED),
  RPOP(null, UNIMPLEMENTED),
  RPOPLPUSH(null, UNIMPLEMENTED),
  RPUSH(null, UNIMPLEMENTED),
  RPUSHX(null, UNIMPLEMENTED),
  SAVE(null, UNIMPLEMENTED),
  SCRIPT(null, UNIMPLEMENTED),
  SLAVEOF(null, UNIMPLEMENTED),
  REPLICAOF(null, UNIMPLEMENTED),
  SORT(null, UNIMPLEMENTED),
  STRALGO(null, UNIMPLEMENTED),
  SWAPDB(null, UNIMPLEMENTED),
  SYNC(null, UNIMPLEMENTED),
  TOUCH(null, UNIMPLEMENTED),
  UNWATCH(null, UNIMPLEMENTED),
  WAIT(null, UNIMPLEMENTED),
  WATCH(null, UNIMPLEMENTED),
  XINFO(null, UNIMPLEMENTED),
  XADD(null, UNIMPLEMENTED),
  XTRIM(null, UNIMPLEMENTED),
  XDEL(null, UNIMPLEMENTED),
  XRANGE(null, UNIMPLEMENTED),
  XREVRANGE(null, UNIMPLEMENTED),
  XLEN(null, UNIMPLEMENTED),
  XREAD(null, UNIMPLEMENTED),
  XGROUP(null, UNIMPLEMENTED),
  XREADGROUP(null, UNIMPLEMENTED),
  XACK(null, UNIMPLEMENTED),
  XCLAIM(null, UNIMPLEMENTED),
  XPENDING(null, UNIMPLEMENTED),
  ZADD(null, UNIMPLEMENTED),
  ZCARD(null, UNIMPLEMENTED),
  ZCOUNT(null, UNIMPLEMENTED),
  ZINCRBY(null, UNIMPLEMENTED),
  ZINTERSTORE(null, UNIMPLEMENTED),
  ZLEXCOUNT(null, UNIMPLEMENTED),
  ZPOPMAX(null, UNIMPLEMENTED),
  ZPOPMIN(null, UNIMPLEMENTED),
  ZRANGE(null, UNIMPLEMENTED),
  ZRANGEBYLEX(null, UNIMPLEMENTED),
  ZREVRANGEBYLEX(null, UNIMPLEMENTED),
  ZRANGEBYSCORE(null, UNIMPLEMENTED),
  ZRANK(null, UNIMPLEMENTED),
  ZREM(null, UNIMPLEMENTED),
  ZREMRANGEBYLEX(null, UNIMPLEMENTED),
  ZREMRANGEBYRANK(null, UNIMPLEMENTED),
  ZREMRANGEBYSCORE(null, UNIMPLEMENTED),
  ZREVRANGE(null, UNIMPLEMENTED),
  ZREVRANGEBYSCORE(null, UNIMPLEMENTED),
  ZREVRANK(null, UNIMPLEMENTED),
  ZSCORE(null, UNIMPLEMENTED),
  ZUNIONSCORE(null, UNIMPLEMENTED),
  ZSCAN(null, UNIMPLEMENTED),

  /***************************************
   *** Unknown Commands ***
   ***************************************/
  UNKNOWN(new UnknownExecutor(), RedisCommandSupportLevel.UNKNOWN);

  private final Executor executor;
  private final ParameterRequirements parameterRequirements;
  private final ParameterRequirements deferredParameterRequirements;
  private final RedisCommandSupportLevel supportLevel;

  RedisCommandType(Executor executor, RedisCommandSupportLevel supportLevel) {
    this(executor, supportLevel, new UnspecifiedParameterRequirements());
  }

  RedisCommandType(Executor executor, RedisCommandSupportLevel supportLevel,
      ParameterRequirements parameterRequirements) {
    this(executor, supportLevel, parameterRequirements, new UnspecifiedParameterRequirements());
  }

  RedisCommandType(Executor executor, RedisCommandSupportLevel supportLevel,
      ParameterRequirements parameterRequirements,
      ParameterRequirements deferredParameterRequirements) {
    this.executor = executor;
    this.supportLevel = supportLevel;
    this.parameterRequirements = parameterRequirements;
    this.deferredParameterRequirements = deferredParameterRequirements;
  }

  public boolean isSupported() {
    return supportLevel == SUPPORTED;
  }

  public boolean isUnsupported() {
    return supportLevel == UNSUPPORTED;
  }

  public boolean isUnimplemented() {
    return supportLevel == UNIMPLEMENTED;
  }

  public boolean isInternal() {
    return supportLevel == INTERNAL;
  }

  public boolean isUnknown() {
    return supportLevel == RedisCommandSupportLevel.UNKNOWN;
  }

  public boolean isAllowedWhileSubscribed() {
    switch (this) {
      case SUBSCRIBE:
      case PSUBSCRIBE:
      case UNSUBSCRIBE:
      case PUNSUBSCRIBE:
      case PING:
      case QUIT:
        return true;
      default:
        return false;
    }
  }

  public void checkDeferredParameters(Command command,
      ExecutionHandlerContext executionHandlerContext) {
    deferredParameterRequirements.checkParameters(command, executionHandlerContext);
  }

  public RedisResponse executeCommand(Command command,
      ExecutionHandlerContext executionHandlerContext) {

    parameterRequirements.checkParameters(command, executionHandlerContext);

    return executor.executeCommand(command, executionHandlerContext);
  }
}
