{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
module Kubernetes.Client.Auth.Basic where

import           Data.ByteString.Base64         ( encode )
import           Data.Function                  ( (&) )
import           Data.Monoid                    ( (<>) )
import           Data.Text                      ( Text )
import           Kubernetes.Client.Auth.Internal.Types
import           Kubernetes.OpenAPI.Core
import           Kubernetes.Client.KubeConfig

import qualified Data.Text.Encoding            as T
import qualified Lens.Micro                    as L


data BasicAuth = BasicAuth { basicAuthUsername :: Text
                           , basicAuthPassword :: Text
                           }

instance AuthMethod BasicAuth where
  applyAuthMethod _ BasicAuth{..} req =
    pure
      $           req
      `setHeader` toHeader ("authorization", "Basic " <> encodeBasicAuth)
      &           L.set rAuthTypesL []
    where
      encodeBasicAuth = T.decodeUtf8 $ encode $ T.encodeUtf8 $ basicAuthUsername <> ":" <> basicAuthPassword

-- |Detects if username and password is specified in AuthConfig, if it is configures 'KubernetesClientConfig' with 'BasicAuth'
basicAuth :: DetectAuth
basicAuth auth (tlsParams, cfg) = do
  u <- username auth
  p <- password auth
  return $ return (tlsParams, setBasicAuth u p cfg)

-- |Configures the 'KubernetesClientConfig' to use basic authentication.
setBasicAuth
  :: Text                 -- ^Username
  -> Text                 -- ^Password
  -> KubernetesClientConfig
  -> KubernetesClientConfig
setBasicAuth u p kcfg = kcfg
  { configAuthMethods = [AnyAuthMethod (BasicAuth u p)]
  }
