{-# 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.Route53RecoveryControlConfig.CreateControlPanel
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a new control panel. A control panel represents a group of
-- routing controls that can be changed together in a single transaction.
-- You can use a control panel to centrally view the operational status of
-- applications across your organization, and trigger multi-app failovers
-- in a single transaction, for example, to fail over an Availability Zone
-- or Amazon Web Services Region.
module Amazonka.Route53RecoveryControlConfig.CreateControlPanel
  ( -- * Creating a Request
    CreateControlPanel (..),
    newCreateControlPanel,

    -- * Request Lenses
    createControlPanel_clientToken,
    createControlPanel_tags,
    createControlPanel_clusterArn,
    createControlPanel_controlPanelName,

    -- * Destructuring the Response
    CreateControlPanelResponse (..),
    newCreateControlPanelResponse,

    -- * Response Lenses
    createControlPanelResponse_controlPanel,
    createControlPanelResponse_httpStatus,
  )
where

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

-- | The details of the control panel that you\'re creating.
--
-- /See:/ 'newCreateControlPanel' smart constructor.
data CreateControlPanel = CreateControlPanel'
  { -- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
    -- idempotent API request with an action, specify a client token in the
    -- request.
    CreateControlPanel -> Maybe Text
clientToken :: Prelude.Maybe Prelude.Text,
    -- | The tags associated with the control panel.
    CreateControlPanel -> Maybe (HashMap Text Text)
tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
    -- | The Amazon Resource Name (ARN) of the cluster for the control panel.
    CreateControlPanel -> Text
clusterArn :: Prelude.Text,
    -- | The name of the control panel.
    CreateControlPanel -> Text
controlPanelName :: Prelude.Text
  }
  deriving (CreateControlPanel -> CreateControlPanel -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateControlPanel -> CreateControlPanel -> Bool
$c/= :: CreateControlPanel -> CreateControlPanel -> Bool
== :: CreateControlPanel -> CreateControlPanel -> Bool
$c== :: CreateControlPanel -> CreateControlPanel -> Bool
Prelude.Eq, ReadPrec [CreateControlPanel]
ReadPrec CreateControlPanel
Int -> ReadS CreateControlPanel
ReadS [CreateControlPanel]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateControlPanel]
$creadListPrec :: ReadPrec [CreateControlPanel]
readPrec :: ReadPrec CreateControlPanel
$creadPrec :: ReadPrec CreateControlPanel
readList :: ReadS [CreateControlPanel]
$creadList :: ReadS [CreateControlPanel]
readsPrec :: Int -> ReadS CreateControlPanel
$creadsPrec :: Int -> ReadS CreateControlPanel
Prelude.Read, Int -> CreateControlPanel -> ShowS
[CreateControlPanel] -> ShowS
CreateControlPanel -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateControlPanel] -> ShowS
$cshowList :: [CreateControlPanel] -> ShowS
show :: CreateControlPanel -> String
$cshow :: CreateControlPanel -> String
showsPrec :: Int -> CreateControlPanel -> ShowS
$cshowsPrec :: Int -> CreateControlPanel -> ShowS
Prelude.Show, forall x. Rep CreateControlPanel x -> CreateControlPanel
forall x. CreateControlPanel -> Rep CreateControlPanel x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateControlPanel x -> CreateControlPanel
$cfrom :: forall x. CreateControlPanel -> Rep CreateControlPanel x
Prelude.Generic)

-- |
-- Create a value of 'CreateControlPanel' 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:
--
-- 'clientToken', 'createControlPanel_clientToken' - A unique, case-sensitive string of up to 64 ASCII characters. To make an
-- idempotent API request with an action, specify a client token in the
-- request.
--
-- 'tags', 'createControlPanel_tags' - The tags associated with the control panel.
--
-- 'clusterArn', 'createControlPanel_clusterArn' - The Amazon Resource Name (ARN) of the cluster for the control panel.
--
-- 'controlPanelName', 'createControlPanel_controlPanelName' - The name of the control panel.
newCreateControlPanel ::
  -- | 'clusterArn'
  Prelude.Text ->
  -- | 'controlPanelName'
  Prelude.Text ->
  CreateControlPanel
newCreateControlPanel :: Text -> Text -> CreateControlPanel
newCreateControlPanel Text
pClusterArn_ Text
pControlPanelName_ =
  CreateControlPanel'
    { $sel:clientToken:CreateControlPanel' :: Maybe Text
clientToken = forall a. Maybe a
Prelude.Nothing,
      $sel:tags:CreateControlPanel' :: Maybe (HashMap Text Text)
tags = forall a. Maybe a
Prelude.Nothing,
      $sel:clusterArn:CreateControlPanel' :: Text
clusterArn = Text
pClusterArn_,
      $sel:controlPanelName:CreateControlPanel' :: Text
controlPanelName = Text
pControlPanelName_
    }

-- | A unique, case-sensitive string of up to 64 ASCII characters. To make an
-- idempotent API request with an action, specify a client token in the
-- request.
createControlPanel_clientToken :: Lens.Lens' CreateControlPanel (Prelude.Maybe Prelude.Text)
createControlPanel_clientToken :: Lens' CreateControlPanel (Maybe Text)
createControlPanel_clientToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateControlPanel' {Maybe Text
clientToken :: Maybe Text
$sel:clientToken:CreateControlPanel' :: CreateControlPanel -> Maybe Text
clientToken} -> Maybe Text
clientToken) (\s :: CreateControlPanel
s@CreateControlPanel' {} Maybe Text
a -> CreateControlPanel
s {$sel:clientToken:CreateControlPanel' :: Maybe Text
clientToken = Maybe Text
a} :: CreateControlPanel)

-- | The tags associated with the control panel.
createControlPanel_tags :: Lens.Lens' CreateControlPanel (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
createControlPanel_tags :: Lens' CreateControlPanel (Maybe (HashMap Text Text))
createControlPanel_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateControlPanel' {Maybe (HashMap Text Text)
tags :: Maybe (HashMap Text Text)
$sel:tags:CreateControlPanel' :: CreateControlPanel -> Maybe (HashMap Text Text)
tags} -> Maybe (HashMap Text Text)
tags) (\s :: CreateControlPanel
s@CreateControlPanel' {} Maybe (HashMap Text Text)
a -> CreateControlPanel
s {$sel:tags:CreateControlPanel' :: Maybe (HashMap Text Text)
tags = Maybe (HashMap Text Text)
a} :: CreateControlPanel) 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

-- | The Amazon Resource Name (ARN) of the cluster for the control panel.
createControlPanel_clusterArn :: Lens.Lens' CreateControlPanel Prelude.Text
createControlPanel_clusterArn :: Lens' CreateControlPanel Text
createControlPanel_clusterArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateControlPanel' {Text
clusterArn :: Text
$sel:clusterArn:CreateControlPanel' :: CreateControlPanel -> Text
clusterArn} -> Text
clusterArn) (\s :: CreateControlPanel
s@CreateControlPanel' {} Text
a -> CreateControlPanel
s {$sel:clusterArn:CreateControlPanel' :: Text
clusterArn = Text
a} :: CreateControlPanel)

-- | The name of the control panel.
createControlPanel_controlPanelName :: Lens.Lens' CreateControlPanel Prelude.Text
createControlPanel_controlPanelName :: Lens' CreateControlPanel Text
createControlPanel_controlPanelName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateControlPanel' {Text
controlPanelName :: Text
$sel:controlPanelName:CreateControlPanel' :: CreateControlPanel -> Text
controlPanelName} -> Text
controlPanelName) (\s :: CreateControlPanel
s@CreateControlPanel' {} Text
a -> CreateControlPanel
s {$sel:controlPanelName:CreateControlPanel' :: Text
controlPanelName = Text
a} :: CreateControlPanel)

instance Core.AWSRequest CreateControlPanel where
  type
    AWSResponse CreateControlPanel =
      CreateControlPanelResponse
  request :: (Service -> Service)
-> CreateControlPanel -> Request CreateControlPanel
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 CreateControlPanel
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateControlPanel)))
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 ControlPanel -> Int -> CreateControlPanelResponse
CreateControlPanelResponse'
            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
"ControlPanel")
            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 CreateControlPanel where
  hashWithSalt :: Int -> CreateControlPanel -> Int
hashWithSalt Int
_salt CreateControlPanel' {Maybe Text
Maybe (HashMap Text Text)
Text
controlPanelName :: Text
clusterArn :: Text
tags :: Maybe (HashMap Text Text)
clientToken :: Maybe Text
$sel:controlPanelName:CreateControlPanel' :: CreateControlPanel -> Text
$sel:clusterArn:CreateControlPanel' :: CreateControlPanel -> Text
$sel:tags:CreateControlPanel' :: CreateControlPanel -> Maybe (HashMap Text Text)
$sel:clientToken:CreateControlPanel' :: CreateControlPanel -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
clientToken
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (HashMap Text Text)
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
clusterArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
controlPanelName

instance Prelude.NFData CreateControlPanel where
  rnf :: CreateControlPanel -> ()
rnf CreateControlPanel' {Maybe Text
Maybe (HashMap Text Text)
Text
controlPanelName :: Text
clusterArn :: Text
tags :: Maybe (HashMap Text Text)
clientToken :: Maybe Text
$sel:controlPanelName:CreateControlPanel' :: CreateControlPanel -> Text
$sel:clusterArn:CreateControlPanel' :: CreateControlPanel -> Text
$sel:tags:CreateControlPanel' :: CreateControlPanel -> Maybe (HashMap Text Text)
$sel:clientToken:CreateControlPanel' :: CreateControlPanel -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
clientToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` 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 Text
clusterArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
controlPanelName

instance Data.ToHeaders CreateControlPanel where
  toHeaders :: CreateControlPanel -> 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 CreateControlPanel where
  toJSON :: CreateControlPanel -> Value
toJSON CreateControlPanel' {Maybe Text
Maybe (HashMap Text Text)
Text
controlPanelName :: Text
clusterArn :: Text
tags :: Maybe (HashMap Text Text)
clientToken :: Maybe Text
$sel:controlPanelName:CreateControlPanel' :: CreateControlPanel -> Text
$sel:clusterArn:CreateControlPanel' :: CreateControlPanel -> Text
$sel:tags:CreateControlPanel' :: CreateControlPanel -> Maybe (HashMap Text Text)
$sel:clientToken:CreateControlPanel' :: CreateControlPanel -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"ClientToken" 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
clientToken,
            (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
"ClusterArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
clusterArn),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"ControlPanelName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
controlPanelName)
          ]
      )

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

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

-- | /See:/ 'newCreateControlPanelResponse' smart constructor.
data CreateControlPanelResponse = CreateControlPanelResponse'
  { -- | Information about a control panel.
    CreateControlPanelResponse -> Maybe ControlPanel
controlPanel :: Prelude.Maybe ControlPanel,
    -- | The response's http status code.
    CreateControlPanelResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateControlPanelResponse -> CreateControlPanelResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateControlPanelResponse -> CreateControlPanelResponse -> Bool
$c/= :: CreateControlPanelResponse -> CreateControlPanelResponse -> Bool
== :: CreateControlPanelResponse -> CreateControlPanelResponse -> Bool
$c== :: CreateControlPanelResponse -> CreateControlPanelResponse -> Bool
Prelude.Eq, ReadPrec [CreateControlPanelResponse]
ReadPrec CreateControlPanelResponse
Int -> ReadS CreateControlPanelResponse
ReadS [CreateControlPanelResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateControlPanelResponse]
$creadListPrec :: ReadPrec [CreateControlPanelResponse]
readPrec :: ReadPrec CreateControlPanelResponse
$creadPrec :: ReadPrec CreateControlPanelResponse
readList :: ReadS [CreateControlPanelResponse]
$creadList :: ReadS [CreateControlPanelResponse]
readsPrec :: Int -> ReadS CreateControlPanelResponse
$creadsPrec :: Int -> ReadS CreateControlPanelResponse
Prelude.Read, Int -> CreateControlPanelResponse -> ShowS
[CreateControlPanelResponse] -> ShowS
CreateControlPanelResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateControlPanelResponse] -> ShowS
$cshowList :: [CreateControlPanelResponse] -> ShowS
show :: CreateControlPanelResponse -> String
$cshow :: CreateControlPanelResponse -> String
showsPrec :: Int -> CreateControlPanelResponse -> ShowS
$cshowsPrec :: Int -> CreateControlPanelResponse -> ShowS
Prelude.Show, forall x.
Rep CreateControlPanelResponse x -> CreateControlPanelResponse
forall x.
CreateControlPanelResponse -> Rep CreateControlPanelResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateControlPanelResponse x -> CreateControlPanelResponse
$cfrom :: forall x.
CreateControlPanelResponse -> Rep CreateControlPanelResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateControlPanelResponse' 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:
--
-- 'controlPanel', 'createControlPanelResponse_controlPanel' - Information about a control panel.
--
-- 'httpStatus', 'createControlPanelResponse_httpStatus' - The response's http status code.
newCreateControlPanelResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateControlPanelResponse
newCreateControlPanelResponse :: Int -> CreateControlPanelResponse
newCreateControlPanelResponse Int
pHttpStatus_ =
  CreateControlPanelResponse'
    { $sel:controlPanel:CreateControlPanelResponse' :: Maybe ControlPanel
controlPanel =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateControlPanelResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Information about a control panel.
createControlPanelResponse_controlPanel :: Lens.Lens' CreateControlPanelResponse (Prelude.Maybe ControlPanel)
createControlPanelResponse_controlPanel :: Lens' CreateControlPanelResponse (Maybe ControlPanel)
createControlPanelResponse_controlPanel = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateControlPanelResponse' {Maybe ControlPanel
controlPanel :: Maybe ControlPanel
$sel:controlPanel:CreateControlPanelResponse' :: CreateControlPanelResponse -> Maybe ControlPanel
controlPanel} -> Maybe ControlPanel
controlPanel) (\s :: CreateControlPanelResponse
s@CreateControlPanelResponse' {} Maybe ControlPanel
a -> CreateControlPanelResponse
s {$sel:controlPanel:CreateControlPanelResponse' :: Maybe ControlPanel
controlPanel = Maybe ControlPanel
a} :: CreateControlPanelResponse)

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

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