module Database.Redis.General
    ( RedisReply(..)
    , keyExists
    , keyExistsB
    , keyDelete
    , keyType
    , keys
    , keysB
    , keyRandom
    , select
    , toUTF8
    , ping
    , unwrapReply
    ) where


import           System.IO

import           Database.Redis.Internal


------------------------------------------------------------------------------
-- | Calls `EXISTS` with a 'String' argument
keyExists :: Handle
          -> String                -- ^ key
          -> IO (Maybe RedisReply)
keyExists h key = request h $ map toUTF8 ["EXISTS", key]


-- | Calls `EXISTS` with a 'ByteString' argument
keyExistsB :: Handle
           -> ByteString            -- ^ key
           -> IO (Maybe RedisReply)
keyExistsB h key = request h [toUTF8 "EXISTS", key]


------------------------------------------------------------------------------
-- | Calls `DEL` with a /single/ 'String' argument. This function does not
-- yet accept multiple keys.
keyDelete :: Handle
          -> String  -- ^ key to delete
          -> IO (Maybe RedisReply)
keyDelete h key = request h $ map toUTF8 ["DEL", key]


------------------------------------------------------------------------------
-- | Calls `TYPE` with a 'String' argument
keyType :: Handle
        -> String
        -> IO (Maybe RedisReply)
keyType h key = request h $ map toUTF8 ["TYPE", key]


------------------------------------------------------------------------------
-- | Calls `KEYS` with a 'String' argument
keys :: Handle
     -> String
     -> IO (Maybe RedisReply)
keys h pattern = request h $ map toUTF8 ["KEYS", pattern]


-- | Calls `KEYS` with a 'String' argument
keysB :: Handle
      -> ByteString
      -> IO (Maybe RedisReply)
keysB h pattern = request h [toUTF8 "KEYS", pattern]


------------------------------------------------------------------------------
-- RANDOMKEY
keyRandom :: Handle
          -> IO (Maybe RedisReply)
keyRandom h = request h [toUTF8 "RANDOMKEY"]


-- RENAME
-- RENAMENX
-- DBSIZE
-- EXPIRE
-- PERSIST
-- TTL


------------------------------------------------------------------------------
-- SELECT
select :: Handle -> Int -> IO (Maybe RedisReply)
select h i = request h $ map toUTF8 ["SELECT", show i]


-- MOVE
-- FLUSHDB
-- FLUSHALL

------------------------------------------------------------------------------
ping :: Handle -> IO (Maybe RedisReply)
ping h = request h $ map toUTF8 ["PING"]