{-# 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.WorkMail.DeleteOrganization
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Deletes an WorkMail organization and all underlying AWS resources
-- managed by WorkMail as part of the organization. You can choose whether
-- to delete the associated directory. For more information, see
-- <https://docs.aws.amazon.com/workmail/latest/adminguide/remove_organization.html Removing an organization>
-- in the /WorkMail Administrator Guide/.
module Amazonka.WorkMail.DeleteOrganization
  ( -- * Creating a Request
    DeleteOrganization (..),
    newDeleteOrganization,

    -- * Request Lenses
    deleteOrganization_clientToken,
    deleteOrganization_organizationId,
    deleteOrganization_deleteDirectory,

    -- * Destructuring the Response
    DeleteOrganizationResponse (..),
    newDeleteOrganizationResponse,

    -- * Response Lenses
    deleteOrganizationResponse_organizationId,
    deleteOrganizationResponse_state,
    deleteOrganizationResponse_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.WorkMail.Types

-- | /See:/ 'newDeleteOrganization' smart constructor.
data DeleteOrganization = DeleteOrganization'
  { -- | The idempotency token associated with the request.
    DeleteOrganization -> Maybe Text
clientToken :: Prelude.Maybe Prelude.Text,
    -- | The organization ID.
    DeleteOrganization -> Text
organizationId :: Prelude.Text,
    -- | If true, deletes the AWS Directory Service directory associated with the
    -- organization.
    DeleteOrganization -> Bool
deleteDirectory :: Prelude.Bool
  }
  deriving (DeleteOrganization -> DeleteOrganization -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DeleteOrganization -> DeleteOrganization -> Bool
$c/= :: DeleteOrganization -> DeleteOrganization -> Bool
== :: DeleteOrganization -> DeleteOrganization -> Bool
$c== :: DeleteOrganization -> DeleteOrganization -> Bool
Prelude.Eq, ReadPrec [DeleteOrganization]
ReadPrec DeleteOrganization
Int -> ReadS DeleteOrganization
ReadS [DeleteOrganization]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DeleteOrganization]
$creadListPrec :: ReadPrec [DeleteOrganization]
readPrec :: ReadPrec DeleteOrganization
$creadPrec :: ReadPrec DeleteOrganization
readList :: ReadS [DeleteOrganization]
$creadList :: ReadS [DeleteOrganization]
readsPrec :: Int -> ReadS DeleteOrganization
$creadsPrec :: Int -> ReadS DeleteOrganization
Prelude.Read, Int -> DeleteOrganization -> ShowS
[DeleteOrganization] -> ShowS
DeleteOrganization -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DeleteOrganization] -> ShowS
$cshowList :: [DeleteOrganization] -> ShowS
show :: DeleteOrganization -> String
$cshow :: DeleteOrganization -> String
showsPrec :: Int -> DeleteOrganization -> ShowS
$cshowsPrec :: Int -> DeleteOrganization -> ShowS
Prelude.Show, forall x. Rep DeleteOrganization x -> DeleteOrganization
forall x. DeleteOrganization -> Rep DeleteOrganization x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DeleteOrganization x -> DeleteOrganization
$cfrom :: forall x. DeleteOrganization -> Rep DeleteOrganization x
Prelude.Generic)

-- |
-- Create a value of 'DeleteOrganization' 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', 'deleteOrganization_clientToken' - The idempotency token associated with the request.
--
-- 'organizationId', 'deleteOrganization_organizationId' - The organization ID.
--
-- 'deleteDirectory', 'deleteOrganization_deleteDirectory' - If true, deletes the AWS Directory Service directory associated with the
-- organization.
newDeleteOrganization ::
  -- | 'organizationId'
  Prelude.Text ->
  -- | 'deleteDirectory'
  Prelude.Bool ->
  DeleteOrganization
newDeleteOrganization :: Text -> Bool -> DeleteOrganization
newDeleteOrganization
  Text
pOrganizationId_
  Bool
pDeleteDirectory_ =
    DeleteOrganization'
      { $sel:clientToken:DeleteOrganization' :: Maybe Text
clientToken = forall a. Maybe a
Prelude.Nothing,
        $sel:organizationId:DeleteOrganization' :: Text
organizationId = Text
pOrganizationId_,
        $sel:deleteDirectory:DeleteOrganization' :: Bool
deleteDirectory = Bool
pDeleteDirectory_
      }

-- | The idempotency token associated with the request.
deleteOrganization_clientToken :: Lens.Lens' DeleteOrganization (Prelude.Maybe Prelude.Text)
deleteOrganization_clientToken :: Lens' DeleteOrganization (Maybe Text)
deleteOrganization_clientToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteOrganization' {Maybe Text
clientToken :: Maybe Text
$sel:clientToken:DeleteOrganization' :: DeleteOrganization -> Maybe Text
clientToken} -> Maybe Text
clientToken) (\s :: DeleteOrganization
s@DeleteOrganization' {} Maybe Text
a -> DeleteOrganization
s {$sel:clientToken:DeleteOrganization' :: Maybe Text
clientToken = Maybe Text
a} :: DeleteOrganization)

-- | The organization ID.
deleteOrganization_organizationId :: Lens.Lens' DeleteOrganization Prelude.Text
deleteOrganization_organizationId :: Lens' DeleteOrganization Text
deleteOrganization_organizationId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteOrganization' {Text
organizationId :: Text
$sel:organizationId:DeleteOrganization' :: DeleteOrganization -> Text
organizationId} -> Text
organizationId) (\s :: DeleteOrganization
s@DeleteOrganization' {} Text
a -> DeleteOrganization
s {$sel:organizationId:DeleteOrganization' :: Text
organizationId = Text
a} :: DeleteOrganization)

-- | If true, deletes the AWS Directory Service directory associated with the
-- organization.
deleteOrganization_deleteDirectory :: Lens.Lens' DeleteOrganization Prelude.Bool
deleteOrganization_deleteDirectory :: Lens' DeleteOrganization Bool
deleteOrganization_deleteDirectory = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteOrganization' {Bool
deleteDirectory :: Bool
$sel:deleteDirectory:DeleteOrganization' :: DeleteOrganization -> Bool
deleteDirectory} -> Bool
deleteDirectory) (\s :: DeleteOrganization
s@DeleteOrganization' {} Bool
a -> DeleteOrganization
s {$sel:deleteDirectory:DeleteOrganization' :: Bool
deleteDirectory = Bool
a} :: DeleteOrganization)

instance Core.AWSRequest DeleteOrganization where
  type
    AWSResponse DeleteOrganization =
      DeleteOrganizationResponse
  request :: (Service -> Service)
-> DeleteOrganization -> Request DeleteOrganization
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 DeleteOrganization
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse DeleteOrganization)))
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 Text -> Maybe Text -> Int -> DeleteOrganizationResponse
DeleteOrganizationResponse'
            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
"OrganizationId")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"State")
            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 DeleteOrganization where
  hashWithSalt :: Int -> DeleteOrganization -> Int
hashWithSalt Int
_salt DeleteOrganization' {Bool
Maybe Text
Text
deleteDirectory :: Bool
organizationId :: Text
clientToken :: Maybe Text
$sel:deleteDirectory:DeleteOrganization' :: DeleteOrganization -> Bool
$sel:organizationId:DeleteOrganization' :: DeleteOrganization -> Text
$sel:clientToken:DeleteOrganization' :: DeleteOrganization -> 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` Text
organizationId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Bool
deleteDirectory

instance Prelude.NFData DeleteOrganization where
  rnf :: DeleteOrganization -> ()
rnf DeleteOrganization' {Bool
Maybe Text
Text
deleteDirectory :: Bool
organizationId :: Text
clientToken :: Maybe Text
$sel:deleteDirectory:DeleteOrganization' :: DeleteOrganization -> Bool
$sel:organizationId:DeleteOrganization' :: DeleteOrganization -> Text
$sel:clientToken:DeleteOrganization' :: DeleteOrganization -> 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 Text
organizationId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Bool
deleteDirectory

instance Data.ToHeaders DeleteOrganization where
  toHeaders :: DeleteOrganization -> 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
"WorkMailService.DeleteOrganization" ::
                          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 DeleteOrganization where
  toJSON :: DeleteOrganization -> Value
toJSON DeleteOrganization' {Bool
Maybe Text
Text
deleteDirectory :: Bool
organizationId :: Text
clientToken :: Maybe Text
$sel:deleteDirectory:DeleteOrganization' :: DeleteOrganization -> Bool
$sel:organizationId:DeleteOrganization' :: DeleteOrganization -> Text
$sel:clientToken:DeleteOrganization' :: DeleteOrganization -> 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,
            forall a. a -> Maybe a
Prelude.Just
              (Key
"OrganizationId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
organizationId),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"DeleteDirectory" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Bool
deleteDirectory)
          ]
      )

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

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

-- | /See:/ 'newDeleteOrganizationResponse' smart constructor.
data DeleteOrganizationResponse = DeleteOrganizationResponse'
  { -- | The organization ID.
    DeleteOrganizationResponse -> Maybe Text
organizationId :: Prelude.Maybe Prelude.Text,
    -- | The state of the organization.
    DeleteOrganizationResponse -> Maybe Text
state :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    DeleteOrganizationResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (DeleteOrganizationResponse -> DeleteOrganizationResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DeleteOrganizationResponse -> DeleteOrganizationResponse -> Bool
$c/= :: DeleteOrganizationResponse -> DeleteOrganizationResponse -> Bool
== :: DeleteOrganizationResponse -> DeleteOrganizationResponse -> Bool
$c== :: DeleteOrganizationResponse -> DeleteOrganizationResponse -> Bool
Prelude.Eq, ReadPrec [DeleteOrganizationResponse]
ReadPrec DeleteOrganizationResponse
Int -> ReadS DeleteOrganizationResponse
ReadS [DeleteOrganizationResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DeleteOrganizationResponse]
$creadListPrec :: ReadPrec [DeleteOrganizationResponse]
readPrec :: ReadPrec DeleteOrganizationResponse
$creadPrec :: ReadPrec DeleteOrganizationResponse
readList :: ReadS [DeleteOrganizationResponse]
$creadList :: ReadS [DeleteOrganizationResponse]
readsPrec :: Int -> ReadS DeleteOrganizationResponse
$creadsPrec :: Int -> ReadS DeleteOrganizationResponse
Prelude.Read, Int -> DeleteOrganizationResponse -> ShowS
[DeleteOrganizationResponse] -> ShowS
DeleteOrganizationResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DeleteOrganizationResponse] -> ShowS
$cshowList :: [DeleteOrganizationResponse] -> ShowS
show :: DeleteOrganizationResponse -> String
$cshow :: DeleteOrganizationResponse -> String
showsPrec :: Int -> DeleteOrganizationResponse -> ShowS
$cshowsPrec :: Int -> DeleteOrganizationResponse -> ShowS
Prelude.Show, forall x.
Rep DeleteOrganizationResponse x -> DeleteOrganizationResponse
forall x.
DeleteOrganizationResponse -> Rep DeleteOrganizationResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DeleteOrganizationResponse x -> DeleteOrganizationResponse
$cfrom :: forall x.
DeleteOrganizationResponse -> Rep DeleteOrganizationResponse x
Prelude.Generic)

-- |
-- Create a value of 'DeleteOrganizationResponse' 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:
--
-- 'organizationId', 'deleteOrganizationResponse_organizationId' - The organization ID.
--
-- 'state', 'deleteOrganizationResponse_state' - The state of the organization.
--
-- 'httpStatus', 'deleteOrganizationResponse_httpStatus' - The response's http status code.
newDeleteOrganizationResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  DeleteOrganizationResponse
newDeleteOrganizationResponse :: Int -> DeleteOrganizationResponse
newDeleteOrganizationResponse Int
pHttpStatus_ =
  DeleteOrganizationResponse'
    { $sel:organizationId:DeleteOrganizationResponse' :: Maybe Text
organizationId =
        forall a. Maybe a
Prelude.Nothing,
      $sel:state:DeleteOrganizationResponse' :: Maybe Text
state = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:DeleteOrganizationResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The organization ID.
deleteOrganizationResponse_organizationId :: Lens.Lens' DeleteOrganizationResponse (Prelude.Maybe Prelude.Text)
deleteOrganizationResponse_organizationId :: Lens' DeleteOrganizationResponse (Maybe Text)
deleteOrganizationResponse_organizationId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteOrganizationResponse' {Maybe Text
organizationId :: Maybe Text
$sel:organizationId:DeleteOrganizationResponse' :: DeleteOrganizationResponse -> Maybe Text
organizationId} -> Maybe Text
organizationId) (\s :: DeleteOrganizationResponse
s@DeleteOrganizationResponse' {} Maybe Text
a -> DeleteOrganizationResponse
s {$sel:organizationId:DeleteOrganizationResponse' :: Maybe Text
organizationId = Maybe Text
a} :: DeleteOrganizationResponse)

-- | The state of the organization.
deleteOrganizationResponse_state :: Lens.Lens' DeleteOrganizationResponse (Prelude.Maybe Prelude.Text)
deleteOrganizationResponse_state :: Lens' DeleteOrganizationResponse (Maybe Text)
deleteOrganizationResponse_state = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteOrganizationResponse' {Maybe Text
state :: Maybe Text
$sel:state:DeleteOrganizationResponse' :: DeleteOrganizationResponse -> Maybe Text
state} -> Maybe Text
state) (\s :: DeleteOrganizationResponse
s@DeleteOrganizationResponse' {} Maybe Text
a -> DeleteOrganizationResponse
s {$sel:state:DeleteOrganizationResponse' :: Maybe Text
state = Maybe Text
a} :: DeleteOrganizationResponse)

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

instance Prelude.NFData DeleteOrganizationResponse where
  rnf :: DeleteOrganizationResponse -> ()
rnf DeleteOrganizationResponse' {Int
Maybe Text
httpStatus :: Int
state :: Maybe Text
organizationId :: Maybe Text
$sel:httpStatus:DeleteOrganizationResponse' :: DeleteOrganizationResponse -> Int
$sel:state:DeleteOrganizationResponse' :: DeleteOrganizationResponse -> Maybe Text
$sel:organizationId:DeleteOrganizationResponse' :: DeleteOrganizationResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
organizationId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
state
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus