module YQL.Crypto
       ( decodeBase64
       , encodeBase64
       , encodeMd5
       , encodeMd5Hex
       , encodeSha
       , uuid
       , encodeHmacSHA1
       , encodeHmacSHA256 ) where

import Control.Monad.IO.Class (liftIO)
import qualified Crypto.Hash.MD5 as MD5
import qualified Crypto.Hash.SHA1 as SHA1

import qualified Data.ByteString.Base64.Lazy as Base64
import Data.ByteString.Lazy
import qualified Data.Digest.Pure.SHA as SHA
import qualified Data.UUID as UUID (toLazyASCIIBytes)
import qualified Data.UUID.V4 as UUID

import Data.YQL (YQLM)

decodeBase64 :: ByteString -> Maybe ByteString
decodeBase64 s = either (const Nothing) Just (Base64.decode s)

encodeBase64 :: ByteString -> ByteString
encodeBase64 s = Base64.encode s

encodeHmacSHA1 :: ByteString -> ByteString -> ByteString
encodeHmacSHA1 secret plaintext =
  SHA.bytestringDigest $ SHA.hmacSha1 secret plaintext

encodeHmacSHA256 :: ByteString -> ByteString -> ByteString
encodeHmacSHA256 secret plaintext =
  SHA.bytestringDigest $ SHA.hmacSha256 secret plaintext

encodeMd5 :: ByteString -> ByteString
encodeMd5 message = fromStrict . MD5.hash . toStrict $ message

encodeMd5Hex :: ByteString -> ByteString
encodeMd5Hex = undefined

encodeSha :: ByteString -> ByteString
encodeSha message = fromStrict . SHA1.hash . toStrict $ message

uuid :: YQLM ByteString
uuid = liftIO $ UUID.nextRandom >>= return . UUID.toLazyASCIIBytes