{-# 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.MediaConnect.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)
--
-- Submits a request to purchase an offering. If you already have an active
-- reservation, you can\'t purchase another offering.
module Amazonka.MediaConnect.PurchaseOffering
  ( -- * Creating a Request
    PurchaseOffering (..),
    newPurchaseOffering,

    -- * Request Lenses
    purchaseOffering_offeringArn,
    purchaseOffering_start,
    purchaseOffering_reservationName,

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

    -- * Response Lenses
    purchaseOfferingResponse_reservation,
    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.MediaConnect.Types
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | A request to purchase a offering.
--
-- /See:/ 'newPurchaseOffering' smart constructor.
data PurchaseOffering = PurchaseOffering'
  { -- | The Amazon Resource Name (ARN) of the offering.
    PurchaseOffering -> Text
offeringArn :: Prelude.Text,
    -- | The date and time that you want the reservation to begin, in Coordinated
    -- Universal Time (UTC). You can specify any date and time between 12:00am
    -- on the first day of the current month to the current time on today\'s
    -- date, inclusive. Specify the start in a 24-hour notation. Use the
    -- following format: YYYY-MM-DDTHH:mm:SSZ, where T and Z are literal
    -- characters. For example, to specify 11:30pm on March 5, 2020, enter
    -- 2020-03-05T23:30:00Z.
    PurchaseOffering -> Text
start :: Prelude.Text,
    -- | The name that you want to use for the reservation.
    PurchaseOffering -> Text
reservationName :: Prelude.Text
  }
  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:
--
-- 'offeringArn', 'purchaseOffering_offeringArn' - The Amazon Resource Name (ARN) of the offering.
--
-- 'start', 'purchaseOffering_start' - The date and time that you want the reservation to begin, in Coordinated
-- Universal Time (UTC). You can specify any date and time between 12:00am
-- on the first day of the current month to the current time on today\'s
-- date, inclusive. Specify the start in a 24-hour notation. Use the
-- following format: YYYY-MM-DDTHH:mm:SSZ, where T and Z are literal
-- characters. For example, to specify 11:30pm on March 5, 2020, enter
-- 2020-03-05T23:30:00Z.
--
-- 'reservationName', 'purchaseOffering_reservationName' - The name that you want to use for the reservation.
newPurchaseOffering ::
  -- | 'offeringArn'
  Prelude.Text ->
  -- | 'start'
  Prelude.Text ->
  -- | 'reservationName'
  Prelude.Text ->
  PurchaseOffering
newPurchaseOffering :: Text -> Text -> Text -> PurchaseOffering
newPurchaseOffering
  Text
pOfferingArn_
  Text
pStart_
  Text
pReservationName_ =
    PurchaseOffering'
      { $sel:offeringArn:PurchaseOffering' :: Text
offeringArn = Text
pOfferingArn_,
        $sel:start:PurchaseOffering' :: Text
start = Text
pStart_,
        $sel:reservationName:PurchaseOffering' :: Text
reservationName = Text
pReservationName_
      }

-- | The Amazon Resource Name (ARN) of the offering.
purchaseOffering_offeringArn :: Lens.Lens' PurchaseOffering Prelude.Text
purchaseOffering_offeringArn :: Lens' PurchaseOffering Text
purchaseOffering_offeringArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOffering' {Text
offeringArn :: Text
$sel:offeringArn:PurchaseOffering' :: PurchaseOffering -> Text
offeringArn} -> Text
offeringArn) (\s :: PurchaseOffering
s@PurchaseOffering' {} Text
a -> PurchaseOffering
s {$sel:offeringArn:PurchaseOffering' :: Text
offeringArn = Text
a} :: PurchaseOffering)

-- | The date and time that you want the reservation to begin, in Coordinated
-- Universal Time (UTC). You can specify any date and time between 12:00am
-- on the first day of the current month to the current time on today\'s
-- date, inclusive. Specify the start in a 24-hour notation. Use the
-- following format: YYYY-MM-DDTHH:mm:SSZ, where T and Z are literal
-- characters. For example, to specify 11:30pm on March 5, 2020, enter
-- 2020-03-05T23:30:00Z.
purchaseOffering_start :: Lens.Lens' PurchaseOffering Prelude.Text
purchaseOffering_start :: Lens' PurchaseOffering Text
purchaseOffering_start = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOffering' {Text
start :: Text
$sel:start:PurchaseOffering' :: PurchaseOffering -> Text
start} -> Text
start) (\s :: PurchaseOffering
s@PurchaseOffering' {} Text
a -> PurchaseOffering
s {$sel:start:PurchaseOffering' :: Text
start = Text
a} :: PurchaseOffering)

-- | The name that you want to use for the reservation.
purchaseOffering_reservationName :: Lens.Lens' PurchaseOffering Prelude.Text
purchaseOffering_reservationName :: Lens' PurchaseOffering Text
purchaseOffering_reservationName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOffering' {Text
reservationName :: Text
$sel:reservationName:PurchaseOffering' :: PurchaseOffering -> Text
reservationName} -> Text
reservationName) (\s :: PurchaseOffering
s@PurchaseOffering' {} Text
a -> PurchaseOffering
s {$sel:reservationName:PurchaseOffering' :: Text
reservationName = Text
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 Reservation -> 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
"reservation")
            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' {Text
reservationName :: Text
start :: Text
offeringArn :: Text
$sel:reservationName:PurchaseOffering' :: PurchaseOffering -> Text
$sel:start:PurchaseOffering' :: PurchaseOffering -> Text
$sel:offeringArn:PurchaseOffering' :: PurchaseOffering -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
offeringArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
start
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
reservationName

instance Prelude.NFData PurchaseOffering where
  rnf :: PurchaseOffering -> ()
rnf PurchaseOffering' {Text
reservationName :: Text
start :: Text
offeringArn :: Text
$sel:reservationName:PurchaseOffering' :: PurchaseOffering -> Text
$sel:start:PurchaseOffering' :: PurchaseOffering -> Text
$sel:offeringArn:PurchaseOffering' :: PurchaseOffering -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
offeringArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
start
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
reservationName

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
"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' {Text
reservationName :: Text
start :: Text
offeringArn :: Text
$sel:reservationName:PurchaseOffering' :: PurchaseOffering -> Text
$sel:start:PurchaseOffering' :: PurchaseOffering -> Text
$sel:offeringArn:PurchaseOffering' :: PurchaseOffering -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"start" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
start),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"reservationName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
reservationName)
          ]
      )

instance Data.ToPath PurchaseOffering where
  toPath :: PurchaseOffering -> ByteString
toPath PurchaseOffering' {Text
reservationName :: Text
start :: Text
offeringArn :: Text
$sel:reservationName:PurchaseOffering' :: PurchaseOffering -> Text
$sel:start:PurchaseOffering' :: PurchaseOffering -> Text
$sel:offeringArn:PurchaseOffering' :: PurchaseOffering -> Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ByteString
"/v1/offerings/", forall a. ToByteString a => a -> ByteString
Data.toBS Text
offeringArn]

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

-- | /See:/ 'newPurchaseOfferingResponse' smart constructor.
data PurchaseOfferingResponse = PurchaseOfferingResponse'
  { PurchaseOfferingResponse -> Maybe Reservation
reservation :: Prelude.Maybe Reservation,
    -- | 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:
--
-- 'reservation', 'purchaseOfferingResponse_reservation' - Undocumented member.
--
-- 'httpStatus', 'purchaseOfferingResponse_httpStatus' - The response's http status code.
newPurchaseOfferingResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  PurchaseOfferingResponse
newPurchaseOfferingResponse :: Int -> PurchaseOfferingResponse
newPurchaseOfferingResponse Int
pHttpStatus_ =
  PurchaseOfferingResponse'
    { $sel:reservation:PurchaseOfferingResponse' :: Maybe Reservation
reservation =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:PurchaseOfferingResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Undocumented member.
purchaseOfferingResponse_reservation :: Lens.Lens' PurchaseOfferingResponse (Prelude.Maybe Reservation)
purchaseOfferingResponse_reservation :: Lens' PurchaseOfferingResponse (Maybe Reservation)
purchaseOfferingResponse_reservation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PurchaseOfferingResponse' {Maybe Reservation
reservation :: Maybe Reservation
$sel:reservation:PurchaseOfferingResponse' :: PurchaseOfferingResponse -> Maybe Reservation
reservation} -> Maybe Reservation
reservation) (\s :: PurchaseOfferingResponse
s@PurchaseOfferingResponse' {} Maybe Reservation
a -> PurchaseOfferingResponse
s {$sel:reservation:PurchaseOfferingResponse' :: Maybe Reservation
reservation = Maybe Reservation
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 Reservation
httpStatus :: Int
reservation :: Maybe Reservation
$sel:httpStatus:PurchaseOfferingResponse' :: PurchaseOfferingResponse -> Int
$sel:reservation:PurchaseOfferingResponse' :: PurchaseOfferingResponse -> Maybe Reservation
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Reservation
reservation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus