module Paddle.Env where

import Prelude ()
import Protolude
import qualified OpenSSL as SSL
import qualified OpenSSL.EVP.PKey as SSL
import qualified OpenSSL.PEM as SSL

data PaddleSecrets = PaddleSecrets
  { PaddleSecrets -> Text
paddlePublicKey :: Text -- ^ despite being a public key this must remain secret or anyone who has it can call our webhooks
  , PaddleSecrets -> Text
paddleApiKey :: Text
  , PaddleSecrets -> Int
paddleVendorId :: Int
  } deriving (PaddleSecrets -> PaddleSecrets -> Bool
(PaddleSecrets -> PaddleSecrets -> Bool)
-> (PaddleSecrets -> PaddleSecrets -> Bool) -> Eq PaddleSecrets
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PaddleSecrets -> PaddleSecrets -> Bool
$c/= :: PaddleSecrets -> PaddleSecrets -> Bool
== :: PaddleSecrets -> PaddleSecrets -> Bool
$c== :: PaddleSecrets -> PaddleSecrets -> Bool
Eq)

-- | Various keys for Paddle. These should all be kept secret.
data Env = Env
  { Env -> SomePublicKey
pctxPubKey :: SSL.SomePublicKey
  , Env -> Int
pctxVendorId :: Int
  , Env -> Text
pctxApiKey :: Text
  } deriving (Env -> Env -> Bool
(Env -> Env -> Bool) -> (Env -> Env -> Bool) -> Eq Env
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Env -> Env -> Bool
$c/= :: Env -> Env -> Bool
== :: Env -> Env -> Bool
$c== :: Env -> Env -> Bool
Eq)

init :: (MonadIO m) => PaddleSecrets -> m Env
init :: PaddleSecrets -> m Env
init PaddleSecrets
secrets = do
  SomePublicKey
pubKey <- IO SomePublicKey -> m SomePublicKey
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO SomePublicKey -> m SomePublicKey)
-> IO SomePublicKey -> m SomePublicKey
forall a b. (a -> b) -> a -> b
$ IO SomePublicKey -> IO SomePublicKey
forall a. IO a -> IO a
SSL.withOpenSSL (IO SomePublicKey -> IO SomePublicKey)
-> IO SomePublicKey -> IO SomePublicKey
forall a b. (a -> b) -> a -> b
$ String -> IO SomePublicKey
SSL.readPublicKey (Text -> String
forall a b. ConvertText a b => a -> b
toS (PaddleSecrets -> Text
paddlePublicKey PaddleSecrets
secrets))
  Env -> m Env
forall (m :: * -> *) a. Monad m => a -> m a
return Env :: SomePublicKey -> Int -> Text -> Env
Env
    { pctxPubKey :: SomePublicKey
pctxPubKey = SomePublicKey
pubKey
    , pctxVendorId :: Int
pctxVendorId = PaddleSecrets -> Int
paddleVendorId PaddleSecrets
secrets
    , pctxApiKey :: Text
pctxApiKey = PaddleSecrets -> Text
paddleApiKey PaddleSecrets
secrets
    }