module TD.Data.SponsoredMessage
  (SponsoredMessage(..)) where

import qualified Data.Aeson as A
import qualified Data.Aeson.Types as AT
import qualified TD.Lib.Internal as I
import qualified TD.Data.MessageContent as MessageContent
import qualified TD.Data.AdvertisementSponsor as AdvertisementSponsor
import qualified Data.Text as T

data SponsoredMessage
  = SponsoredMessage -- ^ Describes a sponsored message
    { SponsoredMessage -> Maybe Int
message_id                 :: Maybe Int                                       -- ^ Message identifier; unique for the chat to which the sponsored message belongs among both ordinary and sponsored messages
    , SponsoredMessage -> Maybe Bool
is_recommended             :: Maybe Bool                                      -- ^ True, if the message needs to be labeled as "recommended" instead of "sponsored"
    , SponsoredMessage -> Maybe Bool
can_be_reported            :: Maybe Bool                                      -- ^ True, if the message can be reported to Telegram moderators through reportChatSponsoredMessage
    , SponsoredMessage -> Maybe MessageContent
content                    :: Maybe MessageContent.MessageContent             -- ^ Content of the message. Currently, can be only of the types messageText, messageAnimation, messagePhoto, or messageVideo. Video messages can be viewed fullscreen. The content must be fully downloaded before the message is shown
    ,                     :: Maybe AdvertisementSponsor.AdvertisementSponsor -- ^ Information about the sponsor of the message
    , SponsoredMessage -> Maybe Text
title                      :: Maybe T.Text                                    -- ^ Title of the sponsored message
    , SponsoredMessage -> Maybe Text
button_text                :: Maybe T.Text                                    -- ^ Text for the message action button
    , SponsoredMessage -> Maybe Int
accent_color_id            :: Maybe Int                                       -- ^ Identifier of the accent color for title, button text and message background
    , SponsoredMessage -> Maybe Int
background_custom_emoji_id :: Maybe Int                                       -- ^ Identifier of a custom emoji to be shown on the message background; 0 if none
    , SponsoredMessage -> Maybe Text
additional_info            :: Maybe T.Text                                    -- ^ If non-empty, additional information about the sponsored message to be shown along with the message
    }
  deriving (SponsoredMessage -> SponsoredMessage -> Bool
(SponsoredMessage -> SponsoredMessage -> Bool)
-> (SponsoredMessage -> SponsoredMessage -> Bool)
-> Eq SponsoredMessage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SponsoredMessage -> SponsoredMessage -> Bool
== :: SponsoredMessage -> SponsoredMessage -> Bool
$c/= :: SponsoredMessage -> SponsoredMessage -> Bool
/= :: SponsoredMessage -> SponsoredMessage -> Bool
Eq, Int -> SponsoredMessage -> ShowS
[SponsoredMessage] -> ShowS
SponsoredMessage -> String
(Int -> SponsoredMessage -> ShowS)
-> (SponsoredMessage -> String)
-> ([SponsoredMessage] -> ShowS)
-> Show SponsoredMessage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SponsoredMessage -> ShowS
showsPrec :: Int -> SponsoredMessage -> ShowS
$cshow :: SponsoredMessage -> String
show :: SponsoredMessage -> String
$cshowList :: [SponsoredMessage] -> ShowS
showList :: [SponsoredMessage] -> ShowS
Show)

instance I.ShortShow SponsoredMessage where
  shortShow :: SponsoredMessage -> String
shortShow SponsoredMessage
    { message_id :: SponsoredMessage -> Maybe Int
message_id                 = Maybe Int
message_id_
    , is_recommended :: SponsoredMessage -> Maybe Bool
is_recommended             = Maybe Bool
is_recommended_
    , can_be_reported :: SponsoredMessage -> Maybe Bool
can_be_reported            = Maybe Bool
can_be_reported_
    , content :: SponsoredMessage -> Maybe MessageContent
content                    = Maybe MessageContent
content_
    , sponsor :: SponsoredMessage -> Maybe AdvertisementSponsor
sponsor                    = Maybe AdvertisementSponsor
sponsor_
    , title :: SponsoredMessage -> Maybe Text
title                      = Maybe Text
title_
    , button_text :: SponsoredMessage -> Maybe Text
button_text                = Maybe Text
button_text_
    , accent_color_id :: SponsoredMessage -> Maybe Int
accent_color_id            = Maybe Int
accent_color_id_
    , background_custom_emoji_id :: SponsoredMessage -> Maybe Int
background_custom_emoji_id = Maybe Int
background_custom_emoji_id_
    , additional_info :: SponsoredMessage -> Maybe Text
additional_info            = Maybe Text
additional_info_
    }
      = String
"SponsoredMessage"
        String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
I.cc
        [ String
"message_id"                 String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
message_id_
        , String
"is_recommended"             String -> Maybe Bool -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Bool
is_recommended_
        , String
"can_be_reported"            String -> Maybe Bool -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Bool
can_be_reported_
        , String
"content"                    String -> Maybe MessageContent -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe MessageContent
content_
        , String
"sponsor"                    String -> Maybe AdvertisementSponsor -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe AdvertisementSponsor
sponsor_
        , String
"title"                      String -> Maybe Text -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Text
title_
        , String
"button_text"                String -> Maybe Text -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Text
button_text_
        , String
"accent_color_id"            String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
accent_color_id_
        , String
"background_custom_emoji_id" String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
background_custom_emoji_id_
        , String
"additional_info"            String -> Maybe Text -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Text
additional_info_
        ]

instance AT.FromJSON SponsoredMessage where
  parseJSON :: Value -> Parser SponsoredMessage
parseJSON v :: Value
v@(AT.Object Object
obj) = do
    String
t <- Object
obj Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
A..: Key
"@type" :: AT.Parser String

    case String
t of
      String
"sponsoredMessage" -> Value -> Parser SponsoredMessage
parseSponsoredMessage Value
v
      String
_                  -> Parser SponsoredMessage
forall a. Monoid a => a
mempty
    
    where
      parseSponsoredMessage :: A.Value -> AT.Parser SponsoredMessage
      parseSponsoredMessage :: Value -> Parser SponsoredMessage
parseSponsoredMessage = String
-> (Object -> Parser SponsoredMessage)
-> Value
-> Parser SponsoredMessage
forall a. String -> (Object -> Parser a) -> Value -> Parser a
A.withObject String
"SponsoredMessage" ((Object -> Parser SponsoredMessage)
 -> Value -> Parser SponsoredMessage)
-> (Object -> Parser SponsoredMessage)
-> Value
-> Parser SponsoredMessage
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
        Maybe Int
message_id_                 <- Object
o Object -> Key -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"message_id"
        Maybe Bool
is_recommended_             <- Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"is_recommended"
        Maybe Bool
can_be_reported_            <- Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"can_be_reported"
        Maybe MessageContent
content_                    <- Object
o Object -> Key -> Parser (Maybe MessageContent)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"content"
        Maybe AdvertisementSponsor
sponsor_                    <- Object
o Object -> Key -> Parser (Maybe AdvertisementSponsor)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"sponsor"
        Maybe Text
title_                      <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"title"
        Maybe Text
button_text_                <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"button_text"
        Maybe Int
accent_color_id_            <- Object
o Object -> Key -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"accent_color_id"
        Maybe Int
background_custom_emoji_id_ <- (String -> Int) -> Maybe String -> Maybe Int
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Int
I.readInt64 (Maybe String -> Maybe Int)
-> Parser (Maybe String) -> Parser (Maybe Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?  Key
"background_custom_emoji_id"
        Maybe Text
additional_info_            <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"additional_info"
        SponsoredMessage -> Parser SponsoredMessage
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (SponsoredMessage -> Parser SponsoredMessage)
-> SponsoredMessage -> Parser SponsoredMessage
forall a b. (a -> b) -> a -> b
$ SponsoredMessage
          { message_id :: Maybe Int
message_id                 = Maybe Int
message_id_
          , is_recommended :: Maybe Bool
is_recommended             = Maybe Bool
is_recommended_
          , can_be_reported :: Maybe Bool
can_be_reported            = Maybe Bool
can_be_reported_
          , content :: Maybe MessageContent
content                    = Maybe MessageContent
content_
          , sponsor :: Maybe AdvertisementSponsor
sponsor                    = Maybe AdvertisementSponsor
sponsor_
          , title :: Maybe Text
title                      = Maybe Text
title_
          , button_text :: Maybe Text
button_text                = Maybe Text
button_text_
          , accent_color_id :: Maybe Int
accent_color_id            = Maybe Int
accent_color_id_
          , background_custom_emoji_id :: Maybe Int
background_custom_emoji_id = Maybe Int
background_custom_emoji_id_
          , additional_info :: Maybe Text
additional_info            = Maybe Text
additional_info_
          }
  parseJSON Value
_ = Parser SponsoredMessage
forall a. Monoid a => a
mempty