/**
 * Static argument syntax hints for common Redis commands.
 * Format: command name (uppercase) → syntax string
 */
export default {
    // Strings
    SET: 'key value [EX seconds | PX ms | EXAT unix-sec | PXAT unix-ms | KEEPTTL] [NX | XX] [GET]',
    GET: 'key',
    MSET: 'key value [key value ...]',
    MGET: 'key [key ...]',
    SETNX: 'key value',
    SETEX: 'key seconds value',
    PSETEX: 'key milliseconds value',
    GETSET: 'key value',
    GETDEL: 'key',
    GETEX: 'key [EX seconds | PX ms | EXAT unix-sec | PXAT unix-ms | PERSIST]',
    GETRANGE: 'key start end',
    SETRANGE: 'key offset value',
    APPEND: 'key value',
    STRLEN: 'key',
    INCR: 'key',
    INCRBY: 'key increment',
    INCRBYFLOAT: 'key increment',
    DECR: 'key',
    DECRBY: 'key decrement',
    MSETNX: 'key value [key value ...]',
    // Redis 8.4
    MSETEX: 'key value [key value ...] [EX seconds | PX ms | EXAT unix-sec | PXAT unix-ms]',
    LCS: 'key1 key2 [LEN] [IDX] [MINMATCHLEN min] [WITHMATCHLEN]',
    SUBSTR: 'key start end',

    // Hash
    HSET: 'key field value [field value ...]',
    HGET: 'key field',
    HMSET: 'key field value [field value ...]',
    HMGET: 'key field [field ...]',
    HGETALL: 'key',
    HDEL: 'key field [field ...]',
    HEXISTS: 'key field',
    HINCRBY: 'key field increment',
    HINCRBYFLOAT: 'key field increment',
    HKEYS: 'key',
    HVALS: 'key',
    HLEN: 'key',
    HSETNX: 'key field value',
    HRANDFIELD: 'key [count [WITHVALUES]]',
    HSCAN: 'key cursor [MATCH pattern] [COUNT count]',
    // Redis 8.0 — per-field hash TTL
    HGETEX: 'key FIELDS count field [field ...] [EX seconds | PX ms | EXAT unix-sec | PXAT unix-ms | PERSIST]',
    HSETEX: 'key FIELDS count field value [field value ...] [EX seconds | PX ms | EXAT unix-sec | PXAT unix-ms | KEEPTTL]',
    HGETDEL: 'key FIELDS count field [field ...]',
    HTTL: 'key FIELDS count field [field ...]',
    HPTTL: 'key FIELDS count field [field ...]',
    HEXPIRE: 'key seconds FIELDS count field [field ...]',
    HPEXPIRE: 'key milliseconds FIELDS count field [field ...]',
    HEXPIREAT: 'key unix-time-seconds FIELDS count field [field ...]',
    HPEXPIREAT: 'key unix-time-ms FIELDS count field [field ...]',
    HPERSIST: 'key FIELDS count field [field ...]',
    HEXPIRETIME: 'key FIELDS count field [field ...]',
    HPEXPIRETIME: 'key FIELDS count field [field ...]',

    // List
    LPUSH: 'key element [element ...]',
    RPUSH: 'key element [element ...]',
    LPOP: 'key [count]',
    RPOP: 'key [count]',
    LLEN: 'key',
    LRANGE: 'key start stop',
    LINDEX: 'key index',
    LSET: 'key index element',
    LINSERT: 'key BEFORE|AFTER pivot element',
    LREM: 'key count element',
    LTRIM: 'key start stop',
    LPOS: 'key element [RANK rank] [COUNT count] [MAXLEN len]',
    LMOVE: 'source destination LEFT|RIGHT LEFT|RIGHT',
    BLPOP: 'key [key ...] timeout',
    BRPOP: 'key [key ...] timeout',
    BLMOVE: 'source destination LEFT|RIGHT LEFT|RIGHT timeout',
    RPOPLPUSH: 'source destination',
    BRPOPLPUSH: 'source destination timeout',
    LPUSHX: 'key element [element ...]',
    RPUSHX: 'key element [element ...]',
    LMPOP: 'numkeys key [key ...] LEFT|RIGHT [COUNT count]',
    BLMPOP: 'timeout numkeys key [key ...] LEFT|RIGHT [COUNT count]',

    // Set
    SADD: 'key member [member ...]',
    SREM: 'key member [member ...]',
    SMEMBERS: 'key',
    SISMEMBER: 'key member',
    SMISMEMBER: 'key member [member ...]',
    SCARD: 'key',
    SPOP: 'key [count]',
    SRANDMEMBER: 'key [count]',
    SINTER: 'key [key ...]',
    SUNION: 'key [key ...]',
    SDIFF: 'key [key ...]',
    SINTERSTORE: 'destination key [key ...]',
    SUNIONSTORE: 'destination key [key ...]',
    SDIFFSTORE: 'destination key [key ...]',
    SMOVE: 'source destination member',
    SINTERCARD: 'numkeys key [key ...] [LIMIT limit]',
    SSCAN: 'key cursor [MATCH pattern] [COUNT count]',

    // Sorted Set
    ZADD: 'key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]',
    ZREM: 'key member [member ...]',
    ZSCORE: 'key member',
    ZMSCORE: 'key member [member ...]',
    ZRANK: 'key member [WITHSCORE]',
    ZREVRANK: 'key member [WITHSCORE]',
    ZRANGE: 'key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]',
    ZRANGEBYSCORE: 'key min max [WITHSCORES] [LIMIT offset count]',
    ZREVRANGEBYSCORE: 'key max min [WITHSCORES] [LIMIT offset count]',
    ZRANGEBYLEX: 'key min max [LIMIT offset count]',
    ZREVRANGEBYLEX: 'key max min [LIMIT offset count]',
    ZRANGESTORE: 'dst src min max [BYSCORE|BYLEX] [REV] [LIMIT offset count]',
    ZCARD: 'key',
    ZCOUNT: 'key min max',
    ZLEXCOUNT: 'key min max',
    ZINCRBY: 'key increment member',
    ZINTERSTORE: 'destination numkeys key [key ...] [WEIGHTS weight ...] [AGGREGATE SUM|MIN|MAX]',
    ZUNIONSTORE: 'destination numkeys key [key ...] [WEIGHTS weight ...] [AGGREGATE SUM|MIN|MAX]',
    ZDIFFSTORE: 'destination numkeys key [key ...]',
    ZINTER: 'numkeys key [key ...] [WEIGHTS weight ...] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]',
    ZUNION: 'numkeys key [key ...] [WEIGHTS weight ...] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]',
    ZDIFF: 'numkeys key [key ...] [WITHSCORES]',
    ZRANDMEMBER: 'key [count [WITHSCORES]]',
    ZPOPMIN: 'key [count]',
    ZPOPMAX: 'key [count]',
    BZPOPMIN: 'key [key ...] timeout',
    BZPOPMAX: 'key [key ...] timeout',
    ZMPOP: 'numkeys key [key ...] MIN|MAX [COUNT count]',
    BZMPOP: 'timeout numkeys key [key ...] MIN|MAX [COUNT count]',
    ZSCAN: 'key cursor [MATCH pattern] [COUNT count]',

    // Key
    DEL: 'key [key ...]',
    UNLINK: 'key [key ...]',
    EXISTS: 'key [key ...]',
    EXPIRE: 'key seconds [NX|XX|GT|LT]',
    PEXPIRE: 'key milliseconds [NX|XX|GT|LT]',
    EXPIREAT: 'key unix-time-seconds [NX|XX|GT|LT]',
    PEXPIREAT: 'key unix-time-milliseconds [NX|XX|GT|LT]',
    PERSIST: 'key',
    TTL: 'key',
    PTTL: 'key',
    EXPIRETIME: 'key',
    PEXPIRETIME: 'key',
    TYPE: 'key',
    RENAME: 'key newkey',
    RENAMENX: 'key newkey',
    KEYS: 'pattern',
    SCAN: 'cursor [MATCH pattern] [COUNT count] [TYPE type]',
    RANDOMKEY: '',
    DUMP: 'key',
    RESTORE: 'key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]',
    COPY: 'source destination [DB destination-db] [REPLACE]',
    MOVE: 'key db',
    OBJECT: 'ENCODING|FREQ|HELP|IDLETIME|REFCOUNT key',
    SORT: 'key [BY pattern] [LIMIT offset count] [GET pattern ...] [ASC|DESC] [ALPHA] [STORE destination]',
    SORT_RO: 'key [BY pattern] [LIMIT offset count] [GET pattern ...] [ASC|DESC] [ALPHA]',
    TOUCH: 'key [key ...]',
    WAIT: 'numreplicas timeout',
    WAITAOF: 'numlocal numreplicas timeout',

    // Stream
    XADD: 'key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]',
    XREAD: '[COUNT count] [BLOCK ms] STREAMS key [key ...] id [id ...]',
    XREADGROUP: 'GROUP group consumer [COUNT count] [BLOCK ms] [NOACK] STREAMS key [key ...] id [id ...]',
    XRANGE: 'key start end [COUNT count]',
    XREVRANGE: 'key end start [COUNT count]',
    XLEN: 'key',
    XINFO: 'CONSUMERS|GROUPS|STREAM key [FULL [COUNT count]]',
    XACK: 'key group id [id ...]',
    XCLAIM: 'key group consumer min-idle-time id [id ...] [IDLE ms] [TIME ms] [RETRYCOUNT count] [FORCE] [JUSTID] [LASTID id]',
    XAUTOCLAIM: 'key group consumer min-idle-time start [COUNT count] [JUSTID]',
    XDEL: 'key id [id ...]',
    XTRIM: 'key MAXLEN|MINID [=|~] threshold [LIMIT count]',
    XGROUP: 'CREATE|CREATECONSUMER|DELCONSUMER|DESTROY|SETID key group [id|$] [MKSTREAM] [ENTRIESREAD entries-read]',
    XPENDING: 'key group [[IDLE min-idle-time] start end count [consumer]]',
    XSETID: 'key last-id [ENTRIESREAD entries-read]',
    // Redis 8.2
    XDELEX: 'key id [id ...] [GROUP group] [IDLE min-idle-time]',
    // Redis 8.6
    XCFGSET: 'key parameter value',

    // Server
    INFO: '[section ...]',
    DBSIZE: '',
    FLUSHDB: '[ASYNC|SYNC]',
    FLUSHALL: '[ASYNC|SYNC]',
    SELECT: 'index',
    PING: '[message]',
    ECHO: 'message',
    QUIT: '',
    CONFIG: 'GET|SET|RESETSTAT|REWRITE parameter [value]',
    SLOWLOG: 'GET|LEN|RESET [count]',
    CLIENT: 'GETNAME|ID|INFO|KILL|LIST|NO-EVICT|PAUSE|REPLY|SETNAME|UNPAUSE|NO-TOUCH ...',
    MEMORY: 'DOCTOR|HELP|MALLOC-STATS|PURGE|STATS|USAGE key [SAMPLES count]',
    TIME: '',
    LASTSAVE: '',
    BGSAVE: '[SCHEDULE]',
    BGREWRITEAOF: '',
    SAVE: '',
    SHUTDOWN: '[NOSAVE|SAVE] [NOW] [FORCE]',
    ACL: 'CAT|DELUSER|GENPASS|GETUSER|LIST|LOAD|LOG|SAVE|SETUSER|WHOAMI ...',
    MODULE: 'LIST|LOAD|LOADEX|UNLOAD ...',
    COMMAND: '[COUNT|DOCS|GETKEYS|INFO|LIST ...]',
    DEBUG: 'subcommand [arg ...]',
    LATENCY: 'HISTORY|LATEST|RESET event',
    SWAPDB: 'index1 index2',
    REPLICAOF: 'host port',
    SLAVEOF: 'host port',
    FAILOVER: '[TO host port [FORCE]] [ABORT] [TIMEOUT ms]',
    CLUSTER: 'INFO|NODES|SLOTS|MYID|RESET|KEYSLOT|SLOT-STATS|MIGRATION|...',
    // Redis 8.4
    DIGEST: 'key',

    // Pub/Sub
    PUBLISH: 'channel message',
    SUBSCRIBE: 'channel [channel ...]',
    UNSUBSCRIBE: '[channel ...]',
    PSUBSCRIBE: 'pattern [pattern ...]',
    PUNSUBSCRIBE: '[pattern ...]',
    PUBSUB: 'CHANNELS|NUMSUB|NUMPAT|SHARDCHANNELS|SHARDNUMSUB [argument ...]',

    // Scripting
    EVAL: '"script" numkeys [key ...] [arg ...]',
    EVALSHA: 'sha1 numkeys [key ...] [arg ...]',
    EVALRO: '"script" numkeys [key ...] [arg ...]',
    EVALSHA_RO: 'sha1 numkeys [key ...] [arg ...]',
    SCRIPT: 'DEBUG|EXISTS|FLUSH|LOAD ...',
    FCALL: 'function numkeys [key ...] [arg ...]',
    FCALL_RO: 'function numkeys [key ...] [arg ...]',
    FUNCTION: 'CREATE|DELETE|DUMP|FLUSH|LIST|LOAD|RESTORE|STATS ...',

    // Geo
    GEOADD: 'key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]',
    GEOPOS: 'key member [member ...]',
    GEODIST: 'key member1 member2 [M|KM|FT|MI]',
    GEOSEARCH: 'key FROMMEMBER member|FROMLONLAT lng lat BYRADIUS radius M|KM|FT|MI|BYBOX width height M|KM|FT|MI [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]',
    GEOSEARCHSTORE: 'destination source FROMMEMBER member|FROMLONLAT lng lat BYRADIUS radius unit|BYBOX width height unit [ASC|DESC] [COUNT count [ANY]] [STOREDIST]',
    GEORADIUS: 'key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]',
    GEORADIUSBYMEMBER: 'key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]',
    GEOHASH: 'key member [member ...]',

    // HyperLogLog
    PFADD: 'key element [element ...]',
    PFCOUNT: 'key [key ...]',
    PFMERGE: 'destkey sourcekey [sourcekey ...]',

    // Bitmap
    SETBIT: 'key offset value',
    GETBIT: 'key offset',
    BITCOUNT: 'key [start end [BYTE|BIT]]',
    BITPOS: 'key bit [start [end [BYTE|BIT]]]',
    BITOP: 'AND|OR|XOR|NOT|DIFF|DIFF1|ANDOR|ONE destkey key [key ...]',
    BITFIELD: 'key [GET encoding offset | SET encoding offset value | INCRBY encoding offset increment | OVERFLOW WRAP|SAT|FAIL] ...',
    BITFIELD_RO: 'key GET encoding offset [GET encoding offset ...]',

    // JSON (ReJSON)
    'JSON.SET': 'key path value [NX|XX]',
    'JSON.GET': 'key [path ...]',
    'JSON.DEL': 'key [path]',
    'JSON.MGET': 'key [key ...] path',
    'JSON.TYPE': 'key [path]',
    'JSON.NUMINCRBY': 'key path value',
    'JSON.NUMMULTBY': 'key path value',
    'JSON.STRAPPEND': 'key [path] value',
    'JSON.STRLEN': 'key [path]',
    'JSON.ARRAPPEND': 'key path value [value ...]',
    'JSON.ARRINDEX': 'key path value [start [stop]]',
    'JSON.ARRINSERT': 'key path index value [value ...]',
    'JSON.ARRLEN': 'key [path]',
    'JSON.ARRPOP': 'key [path [index]]',
    'JSON.ARRTRIM': 'key path start stop',
    'JSON.OBJKEYS': 'key [path]',
    'JSON.OBJLEN': 'key [path]',
    'JSON.RESP': 'key [path]',

    // RediSearch
    'FT.CREATE': 'index [ON HASH|JSON] [PREFIX count prefix ...] SCHEMA field TYPE [SORTABLE] ...',
    'FT.SEARCH': 'index query [NOCONTENT] [VERBATIM] [NOSTOPWORDS] [WITHSCORES] [WITHPAYLOADS] [WITHSORTKEYS] [FILTER field min max ...] [GEOFILTER field lon lat radius unit] [INKEYS count key ...] [INFIELDS count field ...] [RETURN count field ...] [SUMMARIZE ...] [HIGHLIGHT ...] [SLOP slop] [TIMEOUT timeout] [INORDER] [LANGUAGE lang] [EXPANDER exp] [SCORER scorer] [SORTBY field [ASC|DESC]] [LIMIT offset num]',
    'FT.AGGREGATE': 'index query [LOAD count field ...] [GROUPBY count field ... REDUCE func nargs arg ... [AS name]] [SORTBY count field [ASC|DESC] ...] [APPLY expr AS name] [LIMIT offset num] [FILTER expr]',
    'FT.INFO': 'index',
    'FT.DROPINDEX': 'index [DD]',
    'FT._LIST': '',
    'FT.ALTER': 'index SCHEMA ADD field TYPE ...',
    'FT.ALIASADD': 'alias index',
    'FT.ALIASDEL': 'alias',
    'FT.ALIASUPDATE': 'alias index',
    'FT.TAGVALS': 'index field',
    'FT.EXPLAIN': 'index query',
    // Redis 8.4
    'FT.HYBRID': 'index query [SCORER scorer] [WEIGHT text_weight vector_weight] [LIMIT offset num] VECTOR field num value [EF_RUNTIME efrt] [EPSILON eps]',

    // TimeSeries
    'TS.CREATE': 'key [RETENTION retentionPeriod] [ENCODING UNCOMPRESSED|COMPRESSED] [CHUNK_SIZE size] [DUPLICATE_POLICY policy] [LABELS label value ...]',
    'TS.ADD': 'key timestamp value [RETENTION retentionPeriod] [ENCODING UNCOMPRESSED|COMPRESSED] [CHUNK_SIZE size] [ON_DUPLICATE policy] [LABELS label value ...]',
    'TS.MADD': 'key timestamp value [key timestamp value ...]',
    'TS.INCRBY': 'key value [TIMESTAMP timestamp] [RETENTION retentionPeriod] [LABELS label value ...]',
    'TS.DECRBY': 'key value [TIMESTAMP timestamp] [RETENTION retentionPeriod] [LABELS label value ...]',
    'TS.DEL': 'key fromTimestamp toTimestamp',
    'TS.RANGE': 'key fromTimestamp toTimestamp [LATEST] [FILTER_BY_TS ts ...] [FILTER_BY_VALUE min max] [COUNT count] [AGGREGATION aggregator bucketDuration]',
    'TS.REVRANGE': 'key fromTimestamp toTimestamp [LATEST] [FILTER_BY_TS ts ...] [FILTER_BY_VALUE min max] [COUNT count] [AGGREGATION aggregator bucketDuration]',
    'TS.MRANGE': 'fromTimestamp toTimestamp [LATEST] [FILTER_BY_TS ts ...] [FILTER_BY_VALUE min max] [WITHLABELS] [COUNT count] [AGGREGATION aggregator bucketDuration] FILTER filter ...',
    'TS.MREVRANGE': 'fromTimestamp toTimestamp [LATEST] [FILTER_BY_TS ts ...] [FILTER_BY_VALUE min max] [WITHLABELS] [COUNT count] [AGGREGATION aggregator bucketDuration] FILTER filter ...',
    'TS.GET': 'key [LATEST]',
    'TS.MGET': '[LATEST] [WITHLABELS] FILTER filter ...',
    'TS.INFO': 'key [DEBUG]',
    'TS.ALTER': 'key [RETENTION retentionPeriod] [CHUNK_SIZE size] [DUPLICATE_POLICY policy] [LABELS label value ...]',
    'TS.QUERYINDEX': 'filter ...',
    'TS.CREATERULE': 'sourceKey destKey AGGREGATION aggregator bucketDuration [alignTimestamp]',
    'TS.DELETERULE': 'sourceKey destKey',

    // Bloom Filter
    'BF.RESERVE': 'key error_rate capacity [EXPANSION expansion] [NONSCALING]',
    'BF.ADD': 'key item',
    'BF.MADD': 'key item [item ...]',
    'BF.EXISTS': 'key item',
    'BF.MEXISTS': 'key item [item ...]',
    'BF.INFO': 'key [CAPACITY|SIZE|FILTERS|ITEMS|EXPANSION]',
    'BF.INSERT': 'key [CAPACITY cap] [ERROR error] [EXPANSION exp] [NOCREATE] [NONSCALING] ITEMS item [item ...]',

    // Cuckoo Filter
    'CF.RESERVE': 'key capacity [BUCKETSIZE bucketsize] [MAXITERATIONS maxiterations] [EXPANSION expansion]',
    'CF.ADD': 'key item',
    'CF.ADDNX': 'key item',
    'CF.EXISTS': 'key item',
    'CF.MEXISTS': 'key item [item ...]',
    'CF.DEL': 'key item',
    'CF.COUNT': 'key item',
    'CF.INFO': 'key',

    // Top-K
    'TOPK.RESERVE': 'key topk [width] [depth] [decay]',
    'TOPK.ADD': 'key item [item ...]',
    'TOPK.INCRBY': 'key item increment [item increment ...]',
    'TOPK.QUERY': 'key item [item ...]',
    'TOPK.COUNT': 'key item [item ...]',
    'TOPK.LIST': 'key [WITHCOUNT]',
    'TOPK.INFO': 'key',

    // Count-Min Sketch
    'CMS.INITBYDIM': 'key width depth',
    'CMS.INITBYPROB': 'key error probability',
    'CMS.INCRBY': 'key item increment [item increment ...]',
    'CMS.QUERY': 'key item [item ...]',
    'CMS.MERGE': 'destination numkeys source [source ...] [WEIGHTS weight [weight ...]]',
    'CMS.INFO': 'key',

    // T-Digest
    'TDIGEST.CREATE': 'key [COMPRESSION compression]',
    'TDIGEST.ADD': 'key value [value ...]',
    'TDIGEST.MERGE': 'destination-key numkeys source-key [source-key ...] [COMPRESSION compression] [OVERRIDE]',
    'TDIGEST.CDF': 'key value [value ...]',
    'TDIGEST.QUANTILE': 'key quantile [quantile ...]',
    'TDIGEST.MIN': 'key',
    'TDIGEST.MAX': 'key',
    'TDIGEST.TRIMMED_MEAN': 'key low_cut_quantile high_cut_quantile',
    'TDIGEST.RANK': 'key value [value ...]',
    'TDIGEST.REVRANK': 'key value [value ...]',
    'TDIGEST.BYRANK': 'key rank [rank ...]',
    'TDIGEST.BYREVRANK': 'key rank [rank ...]',
    'TDIGEST.INFO': 'key',
    'TDIGEST.RESET': 'key',

    // VectorSet (Redis 8)
    'VADD': 'key [REDUCE dim] VALUES dim val [val ...] element [SETATTR "field\\nvalue\\n..."] [CAS]',
    'VSIM': 'key {ELE element | VALUES dim val [val ...]} [COUNT count] [WITHSCORES] [FILTER expr]',
    'VCARD': 'key',
    'VDIM': 'key',
    'VGETATTR': 'key element',
    'VSETATTR': 'key element "field\\nvalue\\n..."',
    'VREM': 'key element',
    'VINFO': 'key',
    'VLINKS': 'key element [WITHSCORES]',
    'VRANDMEMBER': 'key [count]',
    'VEMB': 'key element',
}
