{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.DeviceFarm.PurchaseOffering
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Immediately purchases offerings for an AWS account. Offerings renew with
-- the latest total purchased quantity for an offering, unless the renewal
-- was overridden. The API returns a @NotEligible@ error if the user is not
-- permitted to invoke the operation. If you must be able to invoke this
-- operation, contact
-- <mailto:aws-devicefarm-support@amazon.com aws-devicefarm-support\@amazon.com>.
module Amazonka.DeviceFarm.PurchaseOffering
  ( -- * Creating a Request
    PurchaseOffering (..),
    newPurchaseOffering,

    -- * Request Lenses
    purchaseOffering_offeringPromotionId,
    purchaseOffering_offeringId,
    purchaseOffering_quantity,

    -- * Destructuring the Response
    PurchaseOfferingResponse (..),
    newPurchaseOfferingResponse,

    -- * Response Lenses
    purchaseOfferingResponse_offeringTransaction,
    purchaseOfferingResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.DeviceFarm.Types
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | Represents a request for a purchase offering.
--
-- /See:/ 'newPurchaseOffering' smart constructor.
data PurchaseOffering = PurchaseOffering'
  { -- | The ID of the offering promotion to be applied to the purchase.
    PurchaseOffering -> Maybe Text
offeringPromotionId :: Prelude.Maybe Prelude.Text,
    -- | The ID of the offering.
    PurchaseOffering -> Text
offeringId :: Prelude.Text,
    -- | The number of device slots to purchase in an offering request.
    PurchaseOffering -> Int
quantity :: Prelude.Int
  }
  deriving (PurchaseOffering -> PurchaseOffering -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PurchaseOffering -> PurchaseOffering -> Bool
$c/= :: PurchaseOffering -> PurchaseOffering -> Bool
== :: PurchaseOffering -> PurchaseOffering -> Bool
$c== :: PurchaseOffering -> PurchaseOffering -> Bool
Prelude.Eq, ReadPrec [PurchaseOffering]
ReadPrec PurchaseOffering
Int -> ReadS PurchaseOffering
ReadS [PurchaseOffering]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [PurchaseOffering]
$creadListPrec :: ReadPrec [PurchaseOffering]
readPrec :: ReadPrec PurchaseOffering
$creadPrec :: ReadPrec PurchaseOffering
readList :: ReadS [PurchaseOffering]
$creadList :: ReadS [PurchaseOffering]
readsPrec :: Int -> ReadS PurchaseOffering
$creadsPrec :: Int -> ReadS PurchaseOffering
Prelude.Read, Int -> PurchaseOffering -> ShowS
[PurchaseOffering] -> ShowS
PurchaseOffering -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PurchaseOffering] -> ShowS
$cshowList :: [PurchaseOffering] -> ShowS
show :: PurchaseOffering -> String
$cshow :: PurchaseOffering -> String
showsPrec :: Int -> PurchaseOffering -> ShowS
$cshowsPrec :: Int -> PurchaseOffering -> ShowS
Prelude.Show, forall x. Rep PurchaseOffering x -> PurchaseOffering
forall x. PurchaseOffering -> Rep PurchaseOffering x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PurchaseOffering x -> PurchaseOffering
$cfrom :: forall x. PurchaseOffering -> Rep PurchaseOffering x
Prelude.Generic)

-- |
-- Create a value of 'PurchaseOffering' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'offeringPromotionId', 'purchaseOffering_offeringPromotionId' - The ID of the offering promotion to be applied to the purchase.
--
-- 'offeringId', 'purchaseOffering_offeringId' - The ID of the offering.
--
-- 'quantity', 'purchaseOffering_quantity' - The number of device slots to purchase in an offering request.
newPurchaseOffering ::
  -- | 'offeringId'
  Prelude.Text ->
  -- | 'quantity'
  Prelude.Int ->
  PurchaseOffering
newPurchaseOffering :: Text -> Int -> PurchaseOffering
newPurchaseOffering Text
pOfferingId_ Int
pQuantity_ =
  PurchaseOffering'
    { $sel:offeringPromotionId:PurchaseOffering' :: Maybe Text
offeringPromotionId =
        forall a. Maybe a
Prelude.Nothing,
      $sel:offeringId:PurchaseOffering' :: Text
offeringId = Text
pOfferingId_,
      $sel:quantity:PurchaseOffering' :: Int
quantity = Int
pQuantity_
    }

-- | The ID of the offering promotion to be applied to the purchase.
purchaseOffering_offeringPromotionId :: Lens.Lens' PurchaseOffering (Prelude.Maybe Prelude.Text)
purchaseOffering_offeringPromotionId :: Lens' PurchaseOffering (Maybe Text)
purchaseOffering_offeringPromotionId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOffering' {Maybe Text
offeringPromotionId :: Maybe Text
$sel:offeringPromotionId:PurchaseOffering' :: PurchaseOffering -> Maybe Text
offeringPromotionId} -> Maybe Text
offeringPromotionId) (\s :: PurchaseOffering
s@PurchaseOffering' {} Maybe Text
a -> PurchaseOffering
s {$sel:offeringPromotionId:PurchaseOffering' :: Maybe Text
offeringPromotionId = Maybe Text
a} :: PurchaseOffering)

-- | The ID of the offering.
purchaseOffering_offeringId :: Lens.Lens' PurchaseOffering Prelude.Text
purchaseOffering_offeringId :: Lens' PurchaseOffering Text
purchaseOffering_offeringId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOffering' {Text
offeringId :: Text
$sel:offeringId:PurchaseOffering' :: PurchaseOffering -> Text
offeringId} -> Text
offeringId) (\s :: PurchaseOffering
s@PurchaseOffering' {} Text
a -> PurchaseOffering
s {$sel:offeringId:PurchaseOffering' :: Text
offeringId = Text
a} :: PurchaseOffering)

-- | The number of device slots to purchase in an offering request.
purchaseOffering_quantity :: Lens.Lens' PurchaseOffering Prelude.Int
purchaseOffering_quantity :: Lens' PurchaseOffering Int
purchaseOffering_quantity = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOffering' {Int
quantity :: Int
$sel:quantity:PurchaseOffering' :: PurchaseOffering -> Int
quantity} -> Int
quantity) (\s :: PurchaseOffering
s@PurchaseOffering' {} Int
a -> PurchaseOffering
s {$sel:quantity:PurchaseOffering' :: Int
quantity = Int
a} :: PurchaseOffering)

instance Core.AWSRequest PurchaseOffering where
  type
    AWSResponse PurchaseOffering =
      PurchaseOfferingResponse
  request :: (Service -> Service)
-> PurchaseOffering -> Request PurchaseOffering
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy PurchaseOffering
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse PurchaseOffering)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe OfferingTransaction -> Int -> PurchaseOfferingResponse
PurchaseOfferingResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"offeringTransaction")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable PurchaseOffering where
  hashWithSalt :: Int -> PurchaseOffering -> Int
hashWithSalt Int
_salt PurchaseOffering' {Int
Maybe Text
Text
quantity :: Int
offeringId :: Text
offeringPromotionId :: Maybe Text
$sel:quantity:PurchaseOffering' :: PurchaseOffering -> Int
$sel:offeringId:PurchaseOffering' :: PurchaseOffering -> Text
$sel:offeringPromotionId:PurchaseOffering' :: PurchaseOffering -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
offeringPromotionId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
offeringId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Int
quantity

instance Prelude.NFData PurchaseOffering where
  rnf :: PurchaseOffering -> ()
rnf PurchaseOffering' {Int
Maybe Text
Text
quantity :: Int
offeringId :: Text
offeringPromotionId :: Maybe Text
$sel:quantity:PurchaseOffering' :: PurchaseOffering -> Int
$sel:offeringId:PurchaseOffering' :: PurchaseOffering -> Text
$sel:offeringPromotionId:PurchaseOffering' :: PurchaseOffering -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
offeringPromotionId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
offeringId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
quantity

instance Data.ToHeaders PurchaseOffering where
  toHeaders :: PurchaseOffering -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"DeviceFarm_20150623.PurchaseOffering" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON PurchaseOffering where
  toJSON :: PurchaseOffering -> Value
toJSON PurchaseOffering' {Int
Maybe Text
Text
quantity :: Int
offeringId :: Text
offeringPromotionId :: Maybe Text
$sel:quantity:PurchaseOffering' :: PurchaseOffering -> Int
$sel:offeringId:PurchaseOffering' :: PurchaseOffering -> Text
$sel:offeringPromotionId:PurchaseOffering' :: PurchaseOffering -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"offeringPromotionId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
offeringPromotionId,
            forall a. a -> Maybe a
Prelude.Just (Key
"offeringId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
offeringId),
            forall a. a -> Maybe a
Prelude.Just (Key
"quantity" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Int
quantity)
          ]
      )

instance Data.ToPath PurchaseOffering where
  toPath :: PurchaseOffering -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Data.ToQuery PurchaseOffering where
  toQuery :: PurchaseOffering -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | The result of the purchase offering (for example, success or failure).
--
-- /See:/ 'newPurchaseOfferingResponse' smart constructor.
data PurchaseOfferingResponse = PurchaseOfferingResponse'
  { -- | Represents the offering transaction for the purchase result.
    PurchaseOfferingResponse -> Maybe OfferingTransaction
offeringTransaction :: Prelude.Maybe OfferingTransaction,
    -- | The response's http status code.
    PurchaseOfferingResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (PurchaseOfferingResponse -> PurchaseOfferingResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PurchaseOfferingResponse -> PurchaseOfferingResponse -> Bool
$c/= :: PurchaseOfferingResponse -> PurchaseOfferingResponse -> Bool
== :: PurchaseOfferingResponse -> PurchaseOfferingResponse -> Bool
$c== :: PurchaseOfferingResponse -> PurchaseOfferingResponse -> Bool
Prelude.Eq, ReadPrec [PurchaseOfferingResponse]
ReadPrec PurchaseOfferingResponse
Int -> ReadS PurchaseOfferingResponse
ReadS [PurchaseOfferingResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [PurchaseOfferingResponse]
$creadListPrec :: ReadPrec [PurchaseOfferingResponse]
readPrec :: ReadPrec PurchaseOfferingResponse
$creadPrec :: ReadPrec PurchaseOfferingResponse
readList :: ReadS [PurchaseOfferingResponse]
$creadList :: ReadS [PurchaseOfferingResponse]
readsPrec :: Int -> ReadS PurchaseOfferingResponse
$creadsPrec :: Int -> ReadS PurchaseOfferingResponse
Prelude.Read, Int -> PurchaseOfferingResponse -> ShowS
[PurchaseOfferingResponse] -> ShowS
PurchaseOfferingResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PurchaseOfferingResponse] -> ShowS
$cshowList :: [PurchaseOfferingResponse] -> ShowS
show :: PurchaseOfferingResponse -> String
$cshow :: PurchaseOfferingResponse -> String
showsPrec :: Int -> PurchaseOfferingResponse -> ShowS
$cshowsPrec :: Int -> PurchaseOfferingResponse -> ShowS
Prelude.Show, forall x.
Rep PurchaseOfferingResponse x -> PurchaseOfferingResponse
forall x.
PurchaseOfferingResponse -> Rep PurchaseOfferingResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep PurchaseOfferingResponse x -> PurchaseOfferingResponse
$cfrom :: forall x.
PurchaseOfferingResponse -> Rep PurchaseOfferingResponse x
Prelude.Generic)

-- |
-- Create a value of 'PurchaseOfferingResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'offeringTransaction', 'purchaseOfferingResponse_offeringTransaction' - Represents the offering transaction for the purchase result.
--
-- 'httpStatus', 'purchaseOfferingResponse_httpStatus' - The response's http status code.
newPurchaseOfferingResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  PurchaseOfferingResponse
newPurchaseOfferingResponse :: Int -> PurchaseOfferingResponse
newPurchaseOfferingResponse Int
pHttpStatus_ =
  PurchaseOfferingResponse'
    { $sel:offeringTransaction:PurchaseOfferingResponse' :: Maybe OfferingTransaction
offeringTransaction =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:PurchaseOfferingResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Represents the offering transaction for the purchase result.
purchaseOfferingResponse_offeringTransaction :: Lens.Lens' PurchaseOfferingResponse (Prelude.Maybe OfferingTransaction)
purchaseOfferingResponse_offeringTransaction :: Lens' PurchaseOfferingResponse (Maybe OfferingTransaction)
purchaseOfferingResponse_offeringTransaction = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOfferingResponse' {Maybe OfferingTransaction
offeringTransaction :: Maybe OfferingTransaction
$sel:offeringTransaction:PurchaseOfferingResponse' :: PurchaseOfferingResponse -> Maybe OfferingTransaction
offeringTransaction} -> Maybe OfferingTransaction
offeringTransaction) (\s :: PurchaseOfferingResponse
s@PurchaseOfferingResponse' {} Maybe OfferingTransaction
a -> PurchaseOfferingResponse
s {$sel:offeringTransaction:PurchaseOfferingResponse' :: Maybe OfferingTransaction
offeringTransaction = Maybe OfferingTransaction
a} :: PurchaseOfferingResponse)

-- | The response's http status code.
purchaseOfferingResponse_httpStatus :: Lens.Lens' PurchaseOfferingResponse Prelude.Int
purchaseOfferingResponse_httpStatus :: Lens' PurchaseOfferingResponse Int
purchaseOfferingResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOfferingResponse' {Int
httpStatus :: Int
$sel:httpStatus:PurchaseOfferingResponse' :: PurchaseOfferingResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: PurchaseOfferingResponse
s@PurchaseOfferingResponse' {} Int
a -> PurchaseOfferingResponse
s {$sel:httpStatus:PurchaseOfferingResponse' :: Int
httpStatus = Int
a} :: PurchaseOfferingResponse)

instance Prelude.NFData PurchaseOfferingResponse where
  rnf :: PurchaseOfferingResponse -> ()
rnf PurchaseOfferingResponse' {Int
Maybe OfferingTransaction
httpStatus :: Int
offeringTransaction :: Maybe OfferingTransaction
$sel:httpStatus:PurchaseOfferingResponse' :: PurchaseOfferingResponse -> Int
$sel:offeringTransaction:PurchaseOfferingResponse' :: PurchaseOfferingResponse -> Maybe OfferingTransaction
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe OfferingTransaction
offeringTransaction
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus