{-# 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.Organizations.UpdateOrganizationalUnit
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Renames the specified organizational unit (OU). The ID and ARN don\'t
-- change. The child OUs and accounts remain in place, and any attached
-- policies of the OU remain attached.
--
-- This operation can be called only from the organization\'s management
-- account.
module Amazonka.Organizations.UpdateOrganizationalUnit
  ( -- * Creating a Request
    UpdateOrganizationalUnit (..),
    newUpdateOrganizationalUnit,

    -- * Request Lenses
    updateOrganizationalUnit_name,
    updateOrganizationalUnit_organizationalUnitId,

    -- * Destructuring the Response
    UpdateOrganizationalUnitResponse (..),
    newUpdateOrganizationalUnitResponse,

    -- * Response Lenses
    updateOrganizationalUnitResponse_organizationalUnit,
    updateOrganizationalUnitResponse_httpStatus,
  )
where

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

-- | /See:/ 'newUpdateOrganizationalUnit' smart constructor.
data UpdateOrganizationalUnit = UpdateOrganizationalUnit'
  { -- | The new name that you want to assign to the OU.
    --
    -- The <http://wikipedia.org/wiki/regex regex pattern> that is used to
    -- validate this parameter is a string of any of the characters in the
    -- ASCII character range.
    UpdateOrganizationalUnit -> Maybe Text
name :: Prelude.Maybe Prelude.Text,
    -- | The unique identifier (ID) of the OU that you want to rename. You can
    -- get the ID from the ListOrganizationalUnitsForParent operation.
    --
    -- The <http://wikipedia.org/wiki/regex regex pattern> for an
    -- organizational unit ID string requires \"ou-\" followed by from 4 to 32
    -- lowercase letters or digits (the ID of the root that contains the OU).
    -- This string is followed by a second \"-\" dash and from 8 to 32
    -- additional lowercase letters or digits.
    UpdateOrganizationalUnit -> Text
organizationalUnitId :: Prelude.Text
  }
  deriving (UpdateOrganizationalUnit -> UpdateOrganizationalUnit -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateOrganizationalUnit -> UpdateOrganizationalUnit -> Bool
$c/= :: UpdateOrganizationalUnit -> UpdateOrganizationalUnit -> Bool
== :: UpdateOrganizationalUnit -> UpdateOrganizationalUnit -> Bool
$c== :: UpdateOrganizationalUnit -> UpdateOrganizationalUnit -> Bool
Prelude.Eq, ReadPrec [UpdateOrganizationalUnit]
ReadPrec UpdateOrganizationalUnit
Int -> ReadS UpdateOrganizationalUnit
ReadS [UpdateOrganizationalUnit]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateOrganizationalUnit]
$creadListPrec :: ReadPrec [UpdateOrganizationalUnit]
readPrec :: ReadPrec UpdateOrganizationalUnit
$creadPrec :: ReadPrec UpdateOrganizationalUnit
readList :: ReadS [UpdateOrganizationalUnit]
$creadList :: ReadS [UpdateOrganizationalUnit]
readsPrec :: Int -> ReadS UpdateOrganizationalUnit
$creadsPrec :: Int -> ReadS UpdateOrganizationalUnit
Prelude.Read, Int -> UpdateOrganizationalUnit -> ShowS
[UpdateOrganizationalUnit] -> ShowS
UpdateOrganizationalUnit -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateOrganizationalUnit] -> ShowS
$cshowList :: [UpdateOrganizationalUnit] -> ShowS
show :: UpdateOrganizationalUnit -> String
$cshow :: UpdateOrganizationalUnit -> String
showsPrec :: Int -> UpdateOrganizationalUnit -> ShowS
$cshowsPrec :: Int -> UpdateOrganizationalUnit -> ShowS
Prelude.Show, forall x.
Rep UpdateOrganizationalUnit x -> UpdateOrganizationalUnit
forall x.
UpdateOrganizationalUnit -> Rep UpdateOrganizationalUnit x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep UpdateOrganizationalUnit x -> UpdateOrganizationalUnit
$cfrom :: forall x.
UpdateOrganizationalUnit -> Rep UpdateOrganizationalUnit x
Prelude.Generic)

-- |
-- Create a value of 'UpdateOrganizationalUnit' 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:
--
-- 'name', 'updateOrganizationalUnit_name' - The new name that you want to assign to the OU.
--
-- The <http://wikipedia.org/wiki/regex regex pattern> that is used to
-- validate this parameter is a string of any of the characters in the
-- ASCII character range.
--
-- 'organizationalUnitId', 'updateOrganizationalUnit_organizationalUnitId' - The unique identifier (ID) of the OU that you want to rename. You can
-- get the ID from the ListOrganizationalUnitsForParent operation.
--
-- The <http://wikipedia.org/wiki/regex regex pattern> for an
-- organizational unit ID string requires \"ou-\" followed by from 4 to 32
-- lowercase letters or digits (the ID of the root that contains the OU).
-- This string is followed by a second \"-\" dash and from 8 to 32
-- additional lowercase letters or digits.
newUpdateOrganizationalUnit ::
  -- | 'organizationalUnitId'
  Prelude.Text ->
  UpdateOrganizationalUnit
newUpdateOrganizationalUnit :: Text -> UpdateOrganizationalUnit
newUpdateOrganizationalUnit Text
pOrganizationalUnitId_ =
  UpdateOrganizationalUnit'
    { $sel:name:UpdateOrganizationalUnit' :: Maybe Text
name = forall a. Maybe a
Prelude.Nothing,
      $sel:organizationalUnitId:UpdateOrganizationalUnit' :: Text
organizationalUnitId = Text
pOrganizationalUnitId_
    }

-- | The new name that you want to assign to the OU.
--
-- The <http://wikipedia.org/wiki/regex regex pattern> that is used to
-- validate this parameter is a string of any of the characters in the
-- ASCII character range.
updateOrganizationalUnit_name :: Lens.Lens' UpdateOrganizationalUnit (Prelude.Maybe Prelude.Text)
updateOrganizationalUnit_name :: Lens' UpdateOrganizationalUnit (Maybe Text)
updateOrganizationalUnit_name = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateOrganizationalUnit' {Maybe Text
name :: Maybe Text
$sel:name:UpdateOrganizationalUnit' :: UpdateOrganizationalUnit -> Maybe Text
name} -> Maybe Text
name) (\s :: UpdateOrganizationalUnit
s@UpdateOrganizationalUnit' {} Maybe Text
a -> UpdateOrganizationalUnit
s {$sel:name:UpdateOrganizationalUnit' :: Maybe Text
name = Maybe Text
a} :: UpdateOrganizationalUnit)

-- | The unique identifier (ID) of the OU that you want to rename. You can
-- get the ID from the ListOrganizationalUnitsForParent operation.
--
-- The <http://wikipedia.org/wiki/regex regex pattern> for an
-- organizational unit ID string requires \"ou-\" followed by from 4 to 32
-- lowercase letters or digits (the ID of the root that contains the OU).
-- This string is followed by a second \"-\" dash and from 8 to 32
-- additional lowercase letters or digits.
updateOrganizationalUnit_organizationalUnitId :: Lens.Lens' UpdateOrganizationalUnit Prelude.Text
updateOrganizationalUnit_organizationalUnitId :: Lens' UpdateOrganizationalUnit Text
updateOrganizationalUnit_organizationalUnitId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateOrganizationalUnit' {Text
organizationalUnitId :: Text
$sel:organizationalUnitId:UpdateOrganizationalUnit' :: UpdateOrganizationalUnit -> Text
organizationalUnitId} -> Text
organizationalUnitId) (\s :: UpdateOrganizationalUnit
s@UpdateOrganizationalUnit' {} Text
a -> UpdateOrganizationalUnit
s {$sel:organizationalUnitId:UpdateOrganizationalUnit' :: Text
organizationalUnitId = Text
a} :: UpdateOrganizationalUnit)

instance Core.AWSRequest UpdateOrganizationalUnit where
  type
    AWSResponse UpdateOrganizationalUnit =
      UpdateOrganizationalUnitResponse
  request :: (Service -> Service)
-> UpdateOrganizationalUnit -> Request UpdateOrganizationalUnit
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 UpdateOrganizationalUnit
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse UpdateOrganizationalUnit)))
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 OrganizationalUnit -> Int -> UpdateOrganizationalUnitResponse
UpdateOrganizationalUnitResponse'
            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
"OrganizationalUnit")
            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 UpdateOrganizationalUnit where
  hashWithSalt :: Int -> UpdateOrganizationalUnit -> Int
hashWithSalt Int
_salt UpdateOrganizationalUnit' {Maybe Text
Text
organizationalUnitId :: Text
name :: Maybe Text
$sel:organizationalUnitId:UpdateOrganizationalUnit' :: UpdateOrganizationalUnit -> Text
$sel:name:UpdateOrganizationalUnit' :: UpdateOrganizationalUnit -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
name
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
organizationalUnitId

instance Prelude.NFData UpdateOrganizationalUnit where
  rnf :: UpdateOrganizationalUnit -> ()
rnf UpdateOrganizationalUnit' {Maybe Text
Text
organizationalUnitId :: Text
name :: Maybe Text
$sel:organizationalUnitId:UpdateOrganizationalUnit' :: UpdateOrganizationalUnit -> Text
$sel:name:UpdateOrganizationalUnit' :: UpdateOrganizationalUnit -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
name
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
organizationalUnitId

instance Data.ToHeaders UpdateOrganizationalUnit where
  toHeaders :: UpdateOrganizationalUnit -> 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
"AWSOrganizationsV20161128.UpdateOrganizationalUnit" ::
                          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 UpdateOrganizationalUnit where
  toJSON :: UpdateOrganizationalUnit -> Value
toJSON UpdateOrganizationalUnit' {Maybe Text
Text
organizationalUnitId :: Text
name :: Maybe Text
$sel:organizationalUnitId:UpdateOrganizationalUnit' :: UpdateOrganizationalUnit -> Text
$sel:name:UpdateOrganizationalUnit' :: UpdateOrganizationalUnit -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"Name" 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
name,
            forall a. a -> Maybe a
Prelude.Just
              ( Key
"OrganizationalUnitId"
                  forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
organizationalUnitId
              )
          ]
      )

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

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

-- | /See:/ 'newUpdateOrganizationalUnitResponse' smart constructor.
data UpdateOrganizationalUnitResponse = UpdateOrganizationalUnitResponse'
  { -- | A structure that contains the details about the specified OU, including
    -- its new name.
    UpdateOrganizationalUnitResponse -> Maybe OrganizationalUnit
organizationalUnit :: Prelude.Maybe OrganizationalUnit,
    -- | The response's http status code.
    UpdateOrganizationalUnitResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (UpdateOrganizationalUnitResponse
-> UpdateOrganizationalUnitResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UpdateOrganizationalUnitResponse
-> UpdateOrganizationalUnitResponse -> Bool
$c/= :: UpdateOrganizationalUnitResponse
-> UpdateOrganizationalUnitResponse -> Bool
== :: UpdateOrganizationalUnitResponse
-> UpdateOrganizationalUnitResponse -> Bool
$c== :: UpdateOrganizationalUnitResponse
-> UpdateOrganizationalUnitResponse -> Bool
Prelude.Eq, ReadPrec [UpdateOrganizationalUnitResponse]
ReadPrec UpdateOrganizationalUnitResponse
Int -> ReadS UpdateOrganizationalUnitResponse
ReadS [UpdateOrganizationalUnitResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [UpdateOrganizationalUnitResponse]
$creadListPrec :: ReadPrec [UpdateOrganizationalUnitResponse]
readPrec :: ReadPrec UpdateOrganizationalUnitResponse
$creadPrec :: ReadPrec UpdateOrganizationalUnitResponse
readList :: ReadS [UpdateOrganizationalUnitResponse]
$creadList :: ReadS [UpdateOrganizationalUnitResponse]
readsPrec :: Int -> ReadS UpdateOrganizationalUnitResponse
$creadsPrec :: Int -> ReadS UpdateOrganizationalUnitResponse
Prelude.Read, Int -> UpdateOrganizationalUnitResponse -> ShowS
[UpdateOrganizationalUnitResponse] -> ShowS
UpdateOrganizationalUnitResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateOrganizationalUnitResponse] -> ShowS
$cshowList :: [UpdateOrganizationalUnitResponse] -> ShowS
show :: UpdateOrganizationalUnitResponse -> String
$cshow :: UpdateOrganizationalUnitResponse -> String
showsPrec :: Int -> UpdateOrganizationalUnitResponse -> ShowS
$cshowsPrec :: Int -> UpdateOrganizationalUnitResponse -> ShowS
Prelude.Show, forall x.
Rep UpdateOrganizationalUnitResponse x
-> UpdateOrganizationalUnitResponse
forall x.
UpdateOrganizationalUnitResponse
-> Rep UpdateOrganizationalUnitResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep UpdateOrganizationalUnitResponse x
-> UpdateOrganizationalUnitResponse
$cfrom :: forall x.
UpdateOrganizationalUnitResponse
-> Rep UpdateOrganizationalUnitResponse x
Prelude.Generic)

-- |
-- Create a value of 'UpdateOrganizationalUnitResponse' 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:
--
-- 'organizationalUnit', 'updateOrganizationalUnitResponse_organizationalUnit' - A structure that contains the details about the specified OU, including
-- its new name.
--
-- 'httpStatus', 'updateOrganizationalUnitResponse_httpStatus' - The response's http status code.
newUpdateOrganizationalUnitResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  UpdateOrganizationalUnitResponse
newUpdateOrganizationalUnitResponse :: Int -> UpdateOrganizationalUnitResponse
newUpdateOrganizationalUnitResponse Int
pHttpStatus_ =
  UpdateOrganizationalUnitResponse'
    { $sel:organizationalUnit:UpdateOrganizationalUnitResponse' :: Maybe OrganizationalUnit
organizationalUnit =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:UpdateOrganizationalUnitResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | A structure that contains the details about the specified OU, including
-- its new name.
updateOrganizationalUnitResponse_organizationalUnit :: Lens.Lens' UpdateOrganizationalUnitResponse (Prelude.Maybe OrganizationalUnit)
updateOrganizationalUnitResponse_organizationalUnit :: Lens' UpdateOrganizationalUnitResponse (Maybe OrganizationalUnit)
updateOrganizationalUnitResponse_organizationalUnit = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\UpdateOrganizationalUnitResponse' {Maybe OrganizationalUnit
organizationalUnit :: Maybe OrganizationalUnit
$sel:organizationalUnit:UpdateOrganizationalUnitResponse' :: UpdateOrganizationalUnitResponse -> Maybe OrganizationalUnit
organizationalUnit} -> Maybe OrganizationalUnit
organizationalUnit) (\s :: UpdateOrganizationalUnitResponse
s@UpdateOrganizationalUnitResponse' {} Maybe OrganizationalUnit
a -> UpdateOrganizationalUnitResponse
s {$sel:organizationalUnit:UpdateOrganizationalUnitResponse' :: Maybe OrganizationalUnit
organizationalUnit = Maybe OrganizationalUnit
a} :: UpdateOrganizationalUnitResponse)

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

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