{-# 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.MediaTailor.Types.AdBreak
-- 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.MediaTailor.Types.AdBreak where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.MediaTailor.Types.MessageType
import Amazonka.MediaTailor.Types.SlateSource
import Amazonka.MediaTailor.Types.SpliceInsertMessage
import Amazonka.MediaTailor.Types.TimeSignalMessage
import qualified Amazonka.Prelude as Prelude

-- | Ad break configuration parameters.
--
-- /See:/ 'newAdBreak' smart constructor.
data AdBreak = AdBreak'
  { -- | The SCTE-35 ad insertion type. Accepted value: @SPLICE_INSERT@,
    -- @TIME_SIGNAL@.
    AdBreak -> Maybe MessageType
messageType :: Prelude.Maybe MessageType,
    -- | How long (in milliseconds) after the beginning of the program that an ad
    -- starts. This value must fall within 100ms of a segment boundary,
    -- otherwise the ad break will be skipped.
    AdBreak -> Maybe Integer
offsetMillis :: Prelude.Maybe Prelude.Integer,
    -- | Ad break slate configuration.
    AdBreak -> Maybe SlateSource
slate :: Prelude.Maybe SlateSource,
    -- | This defines the SCTE-35 @splice_insert()@ message inserted around the
    -- ad. For information about using @splice_insert()@, see the SCTE-35
    -- specficiaiton, section 9.7.3.1.
    AdBreak -> Maybe SpliceInsertMessage
spliceInsertMessage :: Prelude.Maybe SpliceInsertMessage,
    -- | Defines the SCTE-35 @time_signal@ message inserted around the ad.
    --
    -- Programs on a channel\'s schedule can be configured with one or more ad
    -- breaks. You can attach a @splice_insert@ SCTE-35 message to the ad
    -- break. This message provides basic metadata about the ad break.
    --
    -- See section 9.7.4 of the 2022 SCTE-35 specification for more
    -- information.
    AdBreak -> Maybe TimeSignalMessage
timeSignalMessage :: Prelude.Maybe TimeSignalMessage
  }
  deriving (AdBreak -> AdBreak -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AdBreak -> AdBreak -> Bool
$c/= :: AdBreak -> AdBreak -> Bool
== :: AdBreak -> AdBreak -> Bool
$c== :: AdBreak -> AdBreak -> Bool
Prelude.Eq, ReadPrec [AdBreak]
ReadPrec AdBreak
Int -> ReadS AdBreak
ReadS [AdBreak]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AdBreak]
$creadListPrec :: ReadPrec [AdBreak]
readPrec :: ReadPrec AdBreak
$creadPrec :: ReadPrec AdBreak
readList :: ReadS [AdBreak]
$creadList :: ReadS [AdBreak]
readsPrec :: Int -> ReadS AdBreak
$creadsPrec :: Int -> ReadS AdBreak
Prelude.Read, Int -> AdBreak -> ShowS
[AdBreak] -> ShowS
AdBreak -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AdBreak] -> ShowS
$cshowList :: [AdBreak] -> ShowS
show :: AdBreak -> String
$cshow :: AdBreak -> String
showsPrec :: Int -> AdBreak -> ShowS
$cshowsPrec :: Int -> AdBreak -> ShowS
Prelude.Show, forall x. Rep AdBreak x -> AdBreak
forall x. AdBreak -> Rep AdBreak x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AdBreak x -> AdBreak
$cfrom :: forall x. AdBreak -> Rep AdBreak x
Prelude.Generic)

-- |
-- Create a value of 'AdBreak' 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:
--
-- 'messageType', 'adBreak_messageType' - The SCTE-35 ad insertion type. Accepted value: @SPLICE_INSERT@,
-- @TIME_SIGNAL@.
--
-- 'offsetMillis', 'adBreak_offsetMillis' - How long (in milliseconds) after the beginning of the program that an ad
-- starts. This value must fall within 100ms of a segment boundary,
-- otherwise the ad break will be skipped.
--
-- 'slate', 'adBreak_slate' - Ad break slate configuration.
--
-- 'spliceInsertMessage', 'adBreak_spliceInsertMessage' - This defines the SCTE-35 @splice_insert()@ message inserted around the
-- ad. For information about using @splice_insert()@, see the SCTE-35
-- specficiaiton, section 9.7.3.1.
--
-- 'timeSignalMessage', 'adBreak_timeSignalMessage' - Defines the SCTE-35 @time_signal@ message inserted around the ad.
--
-- Programs on a channel\'s schedule can be configured with one or more ad
-- breaks. You can attach a @splice_insert@ SCTE-35 message to the ad
-- break. This message provides basic metadata about the ad break.
--
-- See section 9.7.4 of the 2022 SCTE-35 specification for more
-- information.
newAdBreak ::
  AdBreak
newAdBreak :: AdBreak
newAdBreak =
  AdBreak'
    { $sel:messageType:AdBreak' :: Maybe MessageType
messageType = forall a. Maybe a
Prelude.Nothing,
      $sel:offsetMillis:AdBreak' :: Maybe Integer
offsetMillis = forall a. Maybe a
Prelude.Nothing,
      $sel:slate:AdBreak' :: Maybe SlateSource
slate = forall a. Maybe a
Prelude.Nothing,
      $sel:spliceInsertMessage:AdBreak' :: Maybe SpliceInsertMessage
spliceInsertMessage = forall a. Maybe a
Prelude.Nothing,
      $sel:timeSignalMessage:AdBreak' :: Maybe TimeSignalMessage
timeSignalMessage = forall a. Maybe a
Prelude.Nothing
    }

-- | The SCTE-35 ad insertion type. Accepted value: @SPLICE_INSERT@,
-- @TIME_SIGNAL@.
adBreak_messageType :: Lens.Lens' AdBreak (Prelude.Maybe MessageType)
adBreak_messageType :: Lens' AdBreak (Maybe MessageType)
adBreak_messageType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AdBreak' {Maybe MessageType
messageType :: Maybe MessageType
$sel:messageType:AdBreak' :: AdBreak -> Maybe MessageType
messageType} -> Maybe MessageType
messageType) (\s :: AdBreak
s@AdBreak' {} Maybe MessageType
a -> AdBreak
s {$sel:messageType:AdBreak' :: Maybe MessageType
messageType = Maybe MessageType
a} :: AdBreak)

-- | How long (in milliseconds) after the beginning of the program that an ad
-- starts. This value must fall within 100ms of a segment boundary,
-- otherwise the ad break will be skipped.
adBreak_offsetMillis :: Lens.Lens' AdBreak (Prelude.Maybe Prelude.Integer)
adBreak_offsetMillis :: Lens' AdBreak (Maybe Integer)
adBreak_offsetMillis = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AdBreak' {Maybe Integer
offsetMillis :: Maybe Integer
$sel:offsetMillis:AdBreak' :: AdBreak -> Maybe Integer
offsetMillis} -> Maybe Integer
offsetMillis) (\s :: AdBreak
s@AdBreak' {} Maybe Integer
a -> AdBreak
s {$sel:offsetMillis:AdBreak' :: Maybe Integer
offsetMillis = Maybe Integer
a} :: AdBreak)

-- | Ad break slate configuration.
adBreak_slate :: Lens.Lens' AdBreak (Prelude.Maybe SlateSource)
adBreak_slate :: Lens' AdBreak (Maybe SlateSource)
adBreak_slate = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AdBreak' {Maybe SlateSource
slate :: Maybe SlateSource
$sel:slate:AdBreak' :: AdBreak -> Maybe SlateSource
slate} -> Maybe SlateSource
slate) (\s :: AdBreak
s@AdBreak' {} Maybe SlateSource
a -> AdBreak
s {$sel:slate:AdBreak' :: Maybe SlateSource
slate = Maybe SlateSource
a} :: AdBreak)

-- | This defines the SCTE-35 @splice_insert()@ message inserted around the
-- ad. For information about using @splice_insert()@, see the SCTE-35
-- specficiaiton, section 9.7.3.1.
adBreak_spliceInsertMessage :: Lens.Lens' AdBreak (Prelude.Maybe SpliceInsertMessage)
adBreak_spliceInsertMessage :: Lens' AdBreak (Maybe SpliceInsertMessage)
adBreak_spliceInsertMessage = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AdBreak' {Maybe SpliceInsertMessage
spliceInsertMessage :: Maybe SpliceInsertMessage
$sel:spliceInsertMessage:AdBreak' :: AdBreak -> Maybe SpliceInsertMessage
spliceInsertMessage} -> Maybe SpliceInsertMessage
spliceInsertMessage) (\s :: AdBreak
s@AdBreak' {} Maybe SpliceInsertMessage
a -> AdBreak
s {$sel:spliceInsertMessage:AdBreak' :: Maybe SpliceInsertMessage
spliceInsertMessage = Maybe SpliceInsertMessage
a} :: AdBreak)

-- | Defines the SCTE-35 @time_signal@ message inserted around the ad.
--
-- Programs on a channel\'s schedule can be configured with one or more ad
-- breaks. You can attach a @splice_insert@ SCTE-35 message to the ad
-- break. This message provides basic metadata about the ad break.
--
-- See section 9.7.4 of the 2022 SCTE-35 specification for more
-- information.
adBreak_timeSignalMessage :: Lens.Lens' AdBreak (Prelude.Maybe TimeSignalMessage)
adBreak_timeSignalMessage :: Lens' AdBreak (Maybe TimeSignalMessage)
adBreak_timeSignalMessage = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AdBreak' {Maybe TimeSignalMessage
timeSignalMessage :: Maybe TimeSignalMessage
$sel:timeSignalMessage:AdBreak' :: AdBreak -> Maybe TimeSignalMessage
timeSignalMessage} -> Maybe TimeSignalMessage
timeSignalMessage) (\s :: AdBreak
s@AdBreak' {} Maybe TimeSignalMessage
a -> AdBreak
s {$sel:timeSignalMessage:AdBreak' :: Maybe TimeSignalMessage
timeSignalMessage = Maybe TimeSignalMessage
a} :: AdBreak)

instance Data.FromJSON AdBreak where
  parseJSON :: Value -> Parser AdBreak
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"AdBreak"
      ( \Object
x ->
          Maybe MessageType
-> Maybe Integer
-> Maybe SlateSource
-> Maybe SpliceInsertMessage
-> Maybe TimeSignalMessage
-> AdBreak
AdBreak'
            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
"MessageType")
            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
"OffsetMillis")
            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
"Slate")
            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
"SpliceInsertMessage")
            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
"TimeSignalMessage")
      )

instance Prelude.Hashable AdBreak where
  hashWithSalt :: Int -> AdBreak -> Int
hashWithSalt Int
_salt AdBreak' {Maybe Integer
Maybe MessageType
Maybe SlateSource
Maybe SpliceInsertMessage
Maybe TimeSignalMessage
timeSignalMessage :: Maybe TimeSignalMessage
spliceInsertMessage :: Maybe SpliceInsertMessage
slate :: Maybe SlateSource
offsetMillis :: Maybe Integer
messageType :: Maybe MessageType
$sel:timeSignalMessage:AdBreak' :: AdBreak -> Maybe TimeSignalMessage
$sel:spliceInsertMessage:AdBreak' :: AdBreak -> Maybe SpliceInsertMessage
$sel:slate:AdBreak' :: AdBreak -> Maybe SlateSource
$sel:offsetMillis:AdBreak' :: AdBreak -> Maybe Integer
$sel:messageType:AdBreak' :: AdBreak -> Maybe MessageType
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe MessageType
messageType
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Integer
offsetMillis
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe SlateSource
slate
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe SpliceInsertMessage
spliceInsertMessage
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TimeSignalMessage
timeSignalMessage

instance Prelude.NFData AdBreak where
  rnf :: AdBreak -> ()
rnf AdBreak' {Maybe Integer
Maybe MessageType
Maybe SlateSource
Maybe SpliceInsertMessage
Maybe TimeSignalMessage
timeSignalMessage :: Maybe TimeSignalMessage
spliceInsertMessage :: Maybe SpliceInsertMessage
slate :: Maybe SlateSource
offsetMillis :: Maybe Integer
messageType :: Maybe MessageType
$sel:timeSignalMessage:AdBreak' :: AdBreak -> Maybe TimeSignalMessage
$sel:spliceInsertMessage:AdBreak' :: AdBreak -> Maybe SpliceInsertMessage
$sel:slate:AdBreak' :: AdBreak -> Maybe SlateSource
$sel:offsetMillis:AdBreak' :: AdBreak -> Maybe Integer
$sel:messageType:AdBreak' :: AdBreak -> Maybe MessageType
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe MessageType
messageType
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Integer
offsetMillis
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe SlateSource
slate
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe SpliceInsertMessage
spliceInsertMessage
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TimeSignalMessage
timeSignalMessage

instance Data.ToJSON AdBreak where
  toJSON :: AdBreak -> Value
toJSON AdBreak' {Maybe Integer
Maybe MessageType
Maybe SlateSource
Maybe SpliceInsertMessage
Maybe TimeSignalMessage
timeSignalMessage :: Maybe TimeSignalMessage
spliceInsertMessage :: Maybe SpliceInsertMessage
slate :: Maybe SlateSource
offsetMillis :: Maybe Integer
messageType :: Maybe MessageType
$sel:timeSignalMessage:AdBreak' :: AdBreak -> Maybe TimeSignalMessage
$sel:spliceInsertMessage:AdBreak' :: AdBreak -> Maybe SpliceInsertMessage
$sel:slate:AdBreak' :: AdBreak -> Maybe SlateSource
$sel:offsetMillis:AdBreak' :: AdBreak -> Maybe Integer
$sel:messageType:AdBreak' :: AdBreak -> Maybe MessageType
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"MessageType" 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 MessageType
messageType,
            (Key
"OffsetMillis" 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 Integer
offsetMillis,
            (Key
"Slate" 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 SlateSource
slate,
            (Key
"SpliceInsertMessage" 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 SpliceInsertMessage
spliceInsertMessage,
            (Key
"TimeSignalMessage" 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 TimeSignalMessage
timeSignalMessage
          ]
      )