{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.Chime.Types.PhoneNumberOrder
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.Chime.Types.PhoneNumberOrder where

import Amazonka.Chime.Types.OrderedPhoneNumber
import Amazonka.Chime.Types.PhoneNumberOrderStatus
import Amazonka.Chime.Types.PhoneNumberProductType
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

-- | The details of a phone number order created for Amazon Chime.
--
-- /See:/ 'newPhoneNumberOrder' smart constructor.
data PhoneNumberOrder = PhoneNumberOrder'
  { -- | The phone number order creation time stamp, in ISO 8601 format.
    PhoneNumberOrder -> Maybe ISO8601
createdTimestamp :: Prelude.Maybe Data.ISO8601,
    -- | The ordered phone number details, such as the phone number in E.164
    -- format and the phone number status.
    PhoneNumberOrder -> Maybe [OrderedPhoneNumber]
orderedPhoneNumbers :: Prelude.Maybe [OrderedPhoneNumber],
    -- | The phone number order ID.
    PhoneNumberOrder -> Maybe Text
phoneNumberOrderId :: Prelude.Maybe Prelude.Text,
    -- | The phone number order product type.
    PhoneNumberOrder -> Maybe PhoneNumberProductType
productType :: Prelude.Maybe PhoneNumberProductType,
    -- | The status of the phone number order.
    PhoneNumberOrder -> Maybe PhoneNumberOrderStatus
status :: Prelude.Maybe PhoneNumberOrderStatus,
    -- | The updated phone number order time stamp, in ISO 8601 format.
    PhoneNumberOrder -> Maybe ISO8601
updatedTimestamp :: Prelude.Maybe Data.ISO8601
  }
  deriving (PhoneNumberOrder -> PhoneNumberOrder -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PhoneNumberOrder -> PhoneNumberOrder -> Bool
$c/= :: PhoneNumberOrder -> PhoneNumberOrder -> Bool
== :: PhoneNumberOrder -> PhoneNumberOrder -> Bool
$c== :: PhoneNumberOrder -> PhoneNumberOrder -> Bool
Prelude.Eq, Int -> PhoneNumberOrder -> ShowS
[PhoneNumberOrder] -> ShowS
PhoneNumberOrder -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PhoneNumberOrder] -> ShowS
$cshowList :: [PhoneNumberOrder] -> ShowS
show :: PhoneNumberOrder -> String
$cshow :: PhoneNumberOrder -> String
showsPrec :: Int -> PhoneNumberOrder -> ShowS
$cshowsPrec :: Int -> PhoneNumberOrder -> ShowS
Prelude.Show, forall x. Rep PhoneNumberOrder x -> PhoneNumberOrder
forall x. PhoneNumberOrder -> Rep PhoneNumberOrder x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PhoneNumberOrder x -> PhoneNumberOrder
$cfrom :: forall x. PhoneNumberOrder -> Rep PhoneNumberOrder x
Prelude.Generic)

-- |
-- Create a value of 'PhoneNumberOrder' 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:
--
-- 'createdTimestamp', 'phoneNumberOrder_createdTimestamp' - The phone number order creation time stamp, in ISO 8601 format.
--
-- 'orderedPhoneNumbers', 'phoneNumberOrder_orderedPhoneNumbers' - The ordered phone number details, such as the phone number in E.164
-- format and the phone number status.
--
-- 'phoneNumberOrderId', 'phoneNumberOrder_phoneNumberOrderId' - The phone number order ID.
--
-- 'productType', 'phoneNumberOrder_productType' - The phone number order product type.
--
-- 'status', 'phoneNumberOrder_status' - The status of the phone number order.
--
-- 'updatedTimestamp', 'phoneNumberOrder_updatedTimestamp' - The updated phone number order time stamp, in ISO 8601 format.
newPhoneNumberOrder ::
  PhoneNumberOrder
newPhoneNumberOrder :: PhoneNumberOrder
newPhoneNumberOrder =
  PhoneNumberOrder'
    { $sel:createdTimestamp:PhoneNumberOrder' :: Maybe ISO8601
createdTimestamp =
        forall a. Maybe a
Prelude.Nothing,
      $sel:orderedPhoneNumbers:PhoneNumberOrder' :: Maybe [OrderedPhoneNumber]
orderedPhoneNumbers = forall a. Maybe a
Prelude.Nothing,
      $sel:phoneNumberOrderId:PhoneNumberOrder' :: Maybe Text
phoneNumberOrderId = forall a. Maybe a
Prelude.Nothing,
      $sel:productType:PhoneNumberOrder' :: Maybe PhoneNumberProductType
productType = forall a. Maybe a
Prelude.Nothing,
      $sel:status:PhoneNumberOrder' :: Maybe PhoneNumberOrderStatus
status = forall a. Maybe a
Prelude.Nothing,
      $sel:updatedTimestamp:PhoneNumberOrder' :: Maybe ISO8601
updatedTimestamp = forall a. Maybe a
Prelude.Nothing
    }

-- | The phone number order creation time stamp, in ISO 8601 format.
phoneNumberOrder_createdTimestamp :: Lens.Lens' PhoneNumberOrder (Prelude.Maybe Prelude.UTCTime)
phoneNumberOrder_createdTimestamp :: Lens' PhoneNumberOrder (Maybe UTCTime)
phoneNumberOrder_createdTimestamp = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PhoneNumberOrder' {Maybe ISO8601
createdTimestamp :: Maybe ISO8601
$sel:createdTimestamp:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe ISO8601
createdTimestamp} -> Maybe ISO8601
createdTimestamp) (\s :: PhoneNumberOrder
s@PhoneNumberOrder' {} Maybe ISO8601
a -> PhoneNumberOrder
s {$sel:createdTimestamp:PhoneNumberOrder' :: Maybe ISO8601
createdTimestamp = Maybe ISO8601
a} :: PhoneNumberOrder) 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 (a :: Format). Iso' (Time a) UTCTime
Data._Time

-- | The ordered phone number details, such as the phone number in E.164
-- format and the phone number status.
phoneNumberOrder_orderedPhoneNumbers :: Lens.Lens' PhoneNumberOrder (Prelude.Maybe [OrderedPhoneNumber])
phoneNumberOrder_orderedPhoneNumbers :: Lens' PhoneNumberOrder (Maybe [OrderedPhoneNumber])
phoneNumberOrder_orderedPhoneNumbers = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PhoneNumberOrder' {Maybe [OrderedPhoneNumber]
orderedPhoneNumbers :: Maybe [OrderedPhoneNumber]
$sel:orderedPhoneNumbers:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe [OrderedPhoneNumber]
orderedPhoneNumbers} -> Maybe [OrderedPhoneNumber]
orderedPhoneNumbers) (\s :: PhoneNumberOrder
s@PhoneNumberOrder' {} Maybe [OrderedPhoneNumber]
a -> PhoneNumberOrder
s {$sel:orderedPhoneNumbers:PhoneNumberOrder' :: Maybe [OrderedPhoneNumber]
orderedPhoneNumbers = Maybe [OrderedPhoneNumber]
a} :: PhoneNumberOrder) 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 phone number order ID.
phoneNumberOrder_phoneNumberOrderId :: Lens.Lens' PhoneNumberOrder (Prelude.Maybe Prelude.Text)
phoneNumberOrder_phoneNumberOrderId :: Lens' PhoneNumberOrder (Maybe Text)
phoneNumberOrder_phoneNumberOrderId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PhoneNumberOrder' {Maybe Text
phoneNumberOrderId :: Maybe Text
$sel:phoneNumberOrderId:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe Text
phoneNumberOrderId} -> Maybe Text
phoneNumberOrderId) (\s :: PhoneNumberOrder
s@PhoneNumberOrder' {} Maybe Text
a -> PhoneNumberOrder
s {$sel:phoneNumberOrderId:PhoneNumberOrder' :: Maybe Text
phoneNumberOrderId = Maybe Text
a} :: PhoneNumberOrder)

-- | The phone number order product type.
phoneNumberOrder_productType :: Lens.Lens' PhoneNumberOrder (Prelude.Maybe PhoneNumberProductType)
phoneNumberOrder_productType :: Lens' PhoneNumberOrder (Maybe PhoneNumberProductType)
phoneNumberOrder_productType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PhoneNumberOrder' {Maybe PhoneNumberProductType
productType :: Maybe PhoneNumberProductType
$sel:productType:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe PhoneNumberProductType
productType} -> Maybe PhoneNumberProductType
productType) (\s :: PhoneNumberOrder
s@PhoneNumberOrder' {} Maybe PhoneNumberProductType
a -> PhoneNumberOrder
s {$sel:productType:PhoneNumberOrder' :: Maybe PhoneNumberProductType
productType = Maybe PhoneNumberProductType
a} :: PhoneNumberOrder)

-- | The status of the phone number order.
phoneNumberOrder_status :: Lens.Lens' PhoneNumberOrder (Prelude.Maybe PhoneNumberOrderStatus)
phoneNumberOrder_status :: Lens' PhoneNumberOrder (Maybe PhoneNumberOrderStatus)
phoneNumberOrder_status = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PhoneNumberOrder' {Maybe PhoneNumberOrderStatus
status :: Maybe PhoneNumberOrderStatus
$sel:status:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe PhoneNumberOrderStatus
status} -> Maybe PhoneNumberOrderStatus
status) (\s :: PhoneNumberOrder
s@PhoneNumberOrder' {} Maybe PhoneNumberOrderStatus
a -> PhoneNumberOrder
s {$sel:status:PhoneNumberOrder' :: Maybe PhoneNumberOrderStatus
status = Maybe PhoneNumberOrderStatus
a} :: PhoneNumberOrder)

-- | The updated phone number order time stamp, in ISO 8601 format.
phoneNumberOrder_updatedTimestamp :: Lens.Lens' PhoneNumberOrder (Prelude.Maybe Prelude.UTCTime)
phoneNumberOrder_updatedTimestamp :: Lens' PhoneNumberOrder (Maybe UTCTime)
phoneNumberOrder_updatedTimestamp = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PhoneNumberOrder' {Maybe ISO8601
updatedTimestamp :: Maybe ISO8601
$sel:updatedTimestamp:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe ISO8601
updatedTimestamp} -> Maybe ISO8601
updatedTimestamp) (\s :: PhoneNumberOrder
s@PhoneNumberOrder' {} Maybe ISO8601
a -> PhoneNumberOrder
s {$sel:updatedTimestamp:PhoneNumberOrder' :: Maybe ISO8601
updatedTimestamp = Maybe ISO8601
a} :: PhoneNumberOrder) 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 (a :: Format). Iso' (Time a) UTCTime
Data._Time

instance Data.FromJSON PhoneNumberOrder where
  parseJSON :: Value -> Parser PhoneNumberOrder
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"PhoneNumberOrder"
      ( \Object
x ->
          Maybe ISO8601
-> Maybe [OrderedPhoneNumber]
-> Maybe Text
-> Maybe PhoneNumberProductType
-> Maybe PhoneNumberOrderStatus
-> Maybe ISO8601
-> PhoneNumberOrder
PhoneNumberOrder'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"CreatedTimestamp")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ( Object
x
                            forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"OrderedPhoneNumbers"
                            forall a. Parser (Maybe a) -> a -> Parser a
Data..!= forall a. Monoid a => a
Prelude.mempty
                        )
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"PhoneNumberOrderId")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"ProductType")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"Status")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"UpdatedTimestamp")
      )

instance Prelude.Hashable PhoneNumberOrder where
  hashWithSalt :: Int -> PhoneNumberOrder -> Int
hashWithSalt Int
_salt PhoneNumberOrder' {Maybe [OrderedPhoneNumber]
Maybe Text
Maybe ISO8601
Maybe PhoneNumberOrderStatus
Maybe PhoneNumberProductType
updatedTimestamp :: Maybe ISO8601
status :: Maybe PhoneNumberOrderStatus
productType :: Maybe PhoneNumberProductType
phoneNumberOrderId :: Maybe Text
orderedPhoneNumbers :: Maybe [OrderedPhoneNumber]
createdTimestamp :: Maybe ISO8601
$sel:updatedTimestamp:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe ISO8601
$sel:status:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe PhoneNumberOrderStatus
$sel:productType:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe PhoneNumberProductType
$sel:phoneNumberOrderId:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe Text
$sel:orderedPhoneNumbers:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe [OrderedPhoneNumber]
$sel:createdTimestamp:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe ISO8601
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ISO8601
createdTimestamp
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [OrderedPhoneNumber]
orderedPhoneNumbers
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
phoneNumberOrderId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe PhoneNumberProductType
productType
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe PhoneNumberOrderStatus
status
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ISO8601
updatedTimestamp

instance Prelude.NFData PhoneNumberOrder where
  rnf :: PhoneNumberOrder -> ()
rnf PhoneNumberOrder' {Maybe [OrderedPhoneNumber]
Maybe Text
Maybe ISO8601
Maybe PhoneNumberOrderStatus
Maybe PhoneNumberProductType
updatedTimestamp :: Maybe ISO8601
status :: Maybe PhoneNumberOrderStatus
productType :: Maybe PhoneNumberProductType
phoneNumberOrderId :: Maybe Text
orderedPhoneNumbers :: Maybe [OrderedPhoneNumber]
createdTimestamp :: Maybe ISO8601
$sel:updatedTimestamp:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe ISO8601
$sel:status:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe PhoneNumberOrderStatus
$sel:productType:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe PhoneNumberProductType
$sel:phoneNumberOrderId:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe Text
$sel:orderedPhoneNumbers:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe [OrderedPhoneNumber]
$sel:createdTimestamp:PhoneNumberOrder' :: PhoneNumberOrder -> Maybe ISO8601
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe ISO8601
createdTimestamp
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [OrderedPhoneNumber]
orderedPhoneNumbers
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
phoneNumberOrderId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe PhoneNumberProductType
productType
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe PhoneNumberOrderStatus
status
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ISO8601
updatedTimestamp