{-# 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.GroundStation.ReserveContact
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Reserves a contact using specified parameters.
module Amazonka.GroundStation.ReserveContact
  ( -- * Creating a Request
    ReserveContact (..),
    newReserveContact,

    -- * Request Lenses
    reserveContact_tags,
    reserveContact_endTime,
    reserveContact_groundStation,
    reserveContact_missionProfileArn,
    reserveContact_satelliteArn,
    reserveContact_startTime,

    -- * Destructuring the Response
    ContactIdResponse (..),
    newContactIdResponse,

    -- * Response Lenses
    contactIdResponse_contactId,
  )
where

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

-- |
--
-- /See:/ 'newReserveContact' smart constructor.
data ReserveContact = ReserveContact'
  { -- | Tags assigned to a contact.
    ReserveContact -> Maybe (HashMap Text Text)
tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
    -- | End time of a contact in UTC.
    ReserveContact -> POSIX
endTime :: Data.POSIX,
    -- | Name of a ground station.
    ReserveContact -> Text
groundStation :: Prelude.Text,
    -- | ARN of a mission profile.
    ReserveContact -> Text
missionProfileArn :: Prelude.Text,
    -- | ARN of a satellite
    ReserveContact -> Text
satelliteArn :: Prelude.Text,
    -- | Start time of a contact in UTC.
    ReserveContact -> POSIX
startTime :: Data.POSIX
  }
  deriving (ReserveContact -> ReserveContact -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ReserveContact -> ReserveContact -> Bool
$c/= :: ReserveContact -> ReserveContact -> Bool
== :: ReserveContact -> ReserveContact -> Bool
$c== :: ReserveContact -> ReserveContact -> Bool
Prelude.Eq, ReadPrec [ReserveContact]
ReadPrec ReserveContact
Int -> ReadS ReserveContact
ReadS [ReserveContact]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ReserveContact]
$creadListPrec :: ReadPrec [ReserveContact]
readPrec :: ReadPrec ReserveContact
$creadPrec :: ReadPrec ReserveContact
readList :: ReadS [ReserveContact]
$creadList :: ReadS [ReserveContact]
readsPrec :: Int -> ReadS ReserveContact
$creadsPrec :: Int -> ReadS ReserveContact
Prelude.Read, Int -> ReserveContact -> ShowS
[ReserveContact] -> ShowS
ReserveContact -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ReserveContact] -> ShowS
$cshowList :: [ReserveContact] -> ShowS
show :: ReserveContact -> String
$cshow :: ReserveContact -> String
showsPrec :: Int -> ReserveContact -> ShowS
$cshowsPrec :: Int -> ReserveContact -> ShowS
Prelude.Show, forall x. Rep ReserveContact x -> ReserveContact
forall x. ReserveContact -> Rep ReserveContact x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ReserveContact x -> ReserveContact
$cfrom :: forall x. ReserveContact -> Rep ReserveContact x
Prelude.Generic)

-- |
-- Create a value of 'ReserveContact' 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:
--
-- 'tags', 'reserveContact_tags' - Tags assigned to a contact.
--
-- 'endTime', 'reserveContact_endTime' - End time of a contact in UTC.
--
-- 'groundStation', 'reserveContact_groundStation' - Name of a ground station.
--
-- 'missionProfileArn', 'reserveContact_missionProfileArn' - ARN of a mission profile.
--
-- 'satelliteArn', 'reserveContact_satelliteArn' - ARN of a satellite
--
-- 'startTime', 'reserveContact_startTime' - Start time of a contact in UTC.
newReserveContact ::
  -- | 'endTime'
  Prelude.UTCTime ->
  -- | 'groundStation'
  Prelude.Text ->
  -- | 'missionProfileArn'
  Prelude.Text ->
  -- | 'satelliteArn'
  Prelude.Text ->
  -- | 'startTime'
  Prelude.UTCTime ->
  ReserveContact
newReserveContact :: UTCTime -> Text -> Text -> Text -> UTCTime -> ReserveContact
newReserveContact
  UTCTime
pEndTime_
  Text
pGroundStation_
  Text
pMissionProfileArn_
  Text
pSatelliteArn_
  UTCTime
pStartTime_ =
    ReserveContact'
      { $sel:tags:ReserveContact' :: Maybe (HashMap Text Text)
tags = forall a. Maybe a
Prelude.Nothing,
        $sel:endTime:ReserveContact' :: POSIX
endTime = forall (a :: Format). Iso' (Time a) UTCTime
Data._Time forall t b. AReview t b -> b -> t
Lens.# UTCTime
pEndTime_,
        $sel:groundStation:ReserveContact' :: Text
groundStation = Text
pGroundStation_,
        $sel:missionProfileArn:ReserveContact' :: Text
missionProfileArn = Text
pMissionProfileArn_,
        $sel:satelliteArn:ReserveContact' :: Text
satelliteArn = Text
pSatelliteArn_,
        $sel:startTime:ReserveContact' :: POSIX
startTime = forall (a :: Format). Iso' (Time a) UTCTime
Data._Time forall t b. AReview t b -> b -> t
Lens.# UTCTime
pStartTime_
      }

-- | Tags assigned to a contact.
reserveContact_tags :: Lens.Lens' ReserveContact (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
reserveContact_tags :: Lens' ReserveContact (Maybe (HashMap Text Text))
reserveContact_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReserveContact' {Maybe (HashMap Text Text)
tags :: Maybe (HashMap Text Text)
$sel:tags:ReserveContact' :: ReserveContact -> Maybe (HashMap Text Text)
tags} -> Maybe (HashMap Text Text)
tags) (\s :: ReserveContact
s@ReserveContact' {} Maybe (HashMap Text Text)
a -> ReserveContact
s {$sel:tags:ReserveContact' :: Maybe (HashMap Text Text)
tags = Maybe (HashMap Text Text)
a} :: ReserveContact) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | End time of a contact in UTC.
reserveContact_endTime :: Lens.Lens' ReserveContact Prelude.UTCTime
reserveContact_endTime :: Lens' ReserveContact UTCTime
reserveContact_endTime = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReserveContact' {POSIX
endTime :: POSIX
$sel:endTime:ReserveContact' :: ReserveContact -> POSIX
endTime} -> POSIX
endTime) (\s :: ReserveContact
s@ReserveContact' {} POSIX
a -> ReserveContact
s {$sel:endTime:ReserveContact' :: POSIX
endTime = POSIX
a} :: ReserveContact) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (a :: Format). Iso' (Time a) UTCTime
Data._Time

-- | Name of a ground station.
reserveContact_groundStation :: Lens.Lens' ReserveContact Prelude.Text
reserveContact_groundStation :: Lens' ReserveContact Text
reserveContact_groundStation = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReserveContact' {Text
groundStation :: Text
$sel:groundStation:ReserveContact' :: ReserveContact -> Text
groundStation} -> Text
groundStation) (\s :: ReserveContact
s@ReserveContact' {} Text
a -> ReserveContact
s {$sel:groundStation:ReserveContact' :: Text
groundStation = Text
a} :: ReserveContact)

-- | ARN of a mission profile.
reserveContact_missionProfileArn :: Lens.Lens' ReserveContact Prelude.Text
reserveContact_missionProfileArn :: Lens' ReserveContact Text
reserveContact_missionProfileArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReserveContact' {Text
missionProfileArn :: Text
$sel:missionProfileArn:ReserveContact' :: ReserveContact -> Text
missionProfileArn} -> Text
missionProfileArn) (\s :: ReserveContact
s@ReserveContact' {} Text
a -> ReserveContact
s {$sel:missionProfileArn:ReserveContact' :: Text
missionProfileArn = Text
a} :: ReserveContact)

-- | ARN of a satellite
reserveContact_satelliteArn :: Lens.Lens' ReserveContact Prelude.Text
reserveContact_satelliteArn :: Lens' ReserveContact Text
reserveContact_satelliteArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReserveContact' {Text
satelliteArn :: Text
$sel:satelliteArn:ReserveContact' :: ReserveContact -> Text
satelliteArn} -> Text
satelliteArn) (\s :: ReserveContact
s@ReserveContact' {} Text
a -> ReserveContact
s {$sel:satelliteArn:ReserveContact' :: Text
satelliteArn = Text
a} :: ReserveContact)

-- | Start time of a contact in UTC.
reserveContact_startTime :: Lens.Lens' ReserveContact Prelude.UTCTime
reserveContact_startTime :: Lens' ReserveContact UTCTime
reserveContact_startTime = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\ReserveContact' {POSIX
startTime :: POSIX
$sel:startTime:ReserveContact' :: ReserveContact -> POSIX
startTime} -> POSIX
startTime) (\s :: ReserveContact
s@ReserveContact' {} POSIX
a -> ReserveContact
s {$sel:startTime:ReserveContact' :: POSIX
startTime = POSIX
a} :: ReserveContact) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (a :: Format). Iso' (Time a) UTCTime
Data._Time

instance Core.AWSRequest ReserveContact where
  type AWSResponse ReserveContact = ContactIdResponse
  request :: (Service -> Service) -> ReserveContact -> Request ReserveContact
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 ReserveContact
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse ReserveContact)))
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 -> forall a. FromJSON a => Object -> Either String a
Data.eitherParseJSON Object
x)

instance Prelude.Hashable ReserveContact where
  hashWithSalt :: Int -> ReserveContact -> Int
hashWithSalt Int
_salt ReserveContact' {Maybe (HashMap Text Text)
Text
POSIX
startTime :: POSIX
satelliteArn :: Text
missionProfileArn :: Text
groundStation :: Text
endTime :: POSIX
tags :: Maybe (HashMap Text Text)
$sel:startTime:ReserveContact' :: ReserveContact -> POSIX
$sel:satelliteArn:ReserveContact' :: ReserveContact -> Text
$sel:missionProfileArn:ReserveContact' :: ReserveContact -> Text
$sel:groundStation:ReserveContact' :: ReserveContact -> Text
$sel:endTime:ReserveContact' :: ReserveContact -> POSIX
$sel:tags:ReserveContact' :: ReserveContact -> Maybe (HashMap Text Text)
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (HashMap Text Text)
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` POSIX
endTime
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
groundStation
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
missionProfileArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
satelliteArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` POSIX
startTime

instance Prelude.NFData ReserveContact where
  rnf :: ReserveContact -> ()
rnf ReserveContact' {Maybe (HashMap Text Text)
Text
POSIX
startTime :: POSIX
satelliteArn :: Text
missionProfileArn :: Text
groundStation :: Text
endTime :: POSIX
tags :: Maybe (HashMap Text Text)
$sel:startTime:ReserveContact' :: ReserveContact -> POSIX
$sel:satelliteArn:ReserveContact' :: ReserveContact -> Text
$sel:missionProfileArn:ReserveContact' :: ReserveContact -> Text
$sel:groundStation:ReserveContact' :: ReserveContact -> Text
$sel:endTime:ReserveContact' :: ReserveContact -> POSIX
$sel:tags:ReserveContact' :: ReserveContact -> Maybe (HashMap Text Text)
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe (HashMap Text Text)
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf POSIX
endTime
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
groundStation
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
missionProfileArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
satelliteArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf POSIX
startTime

instance Data.ToHeaders ReserveContact where
  toHeaders :: ReserveContact -> 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 ReserveContact where
  toJSON :: ReserveContact -> Value
toJSON ReserveContact' {Maybe (HashMap Text Text)
Text
POSIX
startTime :: POSIX
satelliteArn :: Text
missionProfileArn :: Text
groundStation :: Text
endTime :: POSIX
tags :: Maybe (HashMap Text Text)
$sel:startTime:ReserveContact' :: ReserveContact -> POSIX
$sel:satelliteArn:ReserveContact' :: ReserveContact -> Text
$sel:missionProfileArn:ReserveContact' :: ReserveContact -> Text
$sel:groundStation:ReserveContact' :: ReserveContact -> Text
$sel:endTime:ReserveContact' :: ReserveContact -> POSIX
$sel:tags:ReserveContact' :: ReserveContact -> Maybe (HashMap Text Text)
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"tags" 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 (HashMap Text Text)
tags,
            forall a. a -> Maybe a
Prelude.Just (Key
"endTime" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= POSIX
endTime),
            forall a. a -> Maybe a
Prelude.Just (Key
"groundStation" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
groundStation),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"missionProfileArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
missionProfileArn),
            forall a. a -> Maybe a
Prelude.Just (Key
"satelliteArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
satelliteArn),
            forall a. a -> Maybe a
Prelude.Just (Key
"startTime" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= POSIX
startTime)
          ]
      )

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

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