{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}

module Captcha.Internal where

import Captcha.Internal.Types (HasAddress (address), HasAuth (auth), HasCookies (cookies), HasPassword (password), HasPort (port), HasProtocol (protocol), HasProxy (proxy), HasUsername (username), Proxy)
import Control.Lens (preview, view, (^?), _Just)
import Data.ByteString.Builder (toLazyByteString)
import Data.String.Conversions (cs)
import Data.Text (Text)
import Data.Text.Lazy (toStrict)
import Data.Text.Lazy.Encoding (decodeUtf8)
import Web.Cookie (Cookies)
import qualified Web.Cookie as Cookie

-- | Render the cookies as a lazy text.
renderCookies :: HasCookies a Cookies => a -> Text
renderCookies = toStrict . decodeUtf8 . toLazyByteString . Cookie.renderCookies . view cookies

-- | Retrieve the proxy's type as, converted into 'Text'.
getProxyType :: HasProxy a (Maybe Proxy) => a -> Maybe Text
getProxyType captcha = cs . show <$> captcha ^? proxy . _Just . protocol

-- | Retrieve the proxy's host address.
getProxyAddress :: HasProxy a (Maybe Proxy) => a -> Maybe Text
getProxyAddress = preview $ proxy . _Just . address

-- | Retrieve the proxy's port.
getProxyPort :: HasProxy a (Maybe Proxy) => a -> Maybe Int
getProxyPort = preview $ proxy . _Just . port

-- | Retrieve the proxy's authentication username.
getProxyUsername :: HasProxy a (Maybe Proxy) => a -> Maybe Text
getProxyUsername = preview $ proxy . _Just . auth . _Just . username

-- | Retrieve the proxy's authentication password.
getProxyPassword :: HasProxy a (Maybe Proxy) => a -> Maybe Text
getProxyPassword = preview $ proxy . _Just . auth . _Just . password
