module TD.Data.DraftMessageContent
  (DraftMessageContent(..)) 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.FormattedText as FormattedText
import qualified TD.Data.LinkPreviewOptions as LinkPreviewOptions
import qualified TD.Data.RichMessage as RichMessage
import qualified Data.Text as T
import qualified TD.Data.MessageSelfDestructType as MessageSelfDestructType
import qualified Data.ByteString as BS

-- | Content of the message draft
data DraftMessageContent
  = DraftMessageContentText -- ^ A text message draft
    { DraftMessageContent -> Maybe FormattedText
text                 :: Maybe FormattedText.FormattedText           -- ^ Formatted text to be saved as a draft; 0-getOption("message_text_length_max") characters
    , DraftMessageContent -> Maybe LinkPreviewOptions
link_preview_options :: Maybe LinkPreviewOptions.LinkPreviewOptions -- ^ Options to be used for generation of a link preview; may be null if none; pass null to use default link preview options
    }
  | DraftMessageContentRichMessage -- ^ A rich message draft; not supported in setChatDraftMessage
    { DraftMessageContent -> Maybe RichMessage
message :: Maybe RichMessage.RichMessage -- ^ The rich message; the message must not have not yet uploaded media
    }
  | DraftMessageContentVideoNote -- ^ A video note message draft
    { DraftMessageContent -> Maybe Text
file_path          :: Maybe T.Text                                          -- ^ Path to the file with the video note
    , DraftMessageContent -> Maybe Int
duration           :: Maybe Int                                             -- ^ Duration of the video, in seconds; 0-60
    , DraftMessageContent -> Maybe Int
_length            :: Maybe Int                                             -- ^ Video width and height; must be positive and not greater than 640
    , DraftMessageContent -> Maybe MessageSelfDestructType
self_destruct_type :: Maybe MessageSelfDestructType.MessageSelfDestructType -- ^ Video note self-destruct type; may be null if none; pass null if none; private chats only
    }
  | DraftMessageContentVoiceNote -- ^ A voice note message draft
    { file_path          :: Maybe T.Text                                          -- ^ Path to the file with the voice note
    , duration           :: Maybe Int                                             -- ^ Duration of the voice note, in seconds
    , DraftMessageContent -> Maybe ByteString
waveform           :: Maybe BS.ByteString                                   -- ^ Waveform representation of the voice note in 5-bit format
    , self_destruct_type :: Maybe MessageSelfDestructType.MessageSelfDestructType -- ^ Voice note self-destruct type; may be null if none; pass null if none; private chats only
    }
  deriving (DraftMessageContent -> DraftMessageContent -> Bool
(DraftMessageContent -> DraftMessageContent -> Bool)
-> (DraftMessageContent -> DraftMessageContent -> Bool)
-> Eq DraftMessageContent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DraftMessageContent -> DraftMessageContent -> Bool
== :: DraftMessageContent -> DraftMessageContent -> Bool
$c/= :: DraftMessageContent -> DraftMessageContent -> Bool
/= :: DraftMessageContent -> DraftMessageContent -> Bool
Eq, Int -> DraftMessageContent -> ShowS
[DraftMessageContent] -> ShowS
DraftMessageContent -> String
(Int -> DraftMessageContent -> ShowS)
-> (DraftMessageContent -> String)
-> ([DraftMessageContent] -> ShowS)
-> Show DraftMessageContent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DraftMessageContent -> ShowS
showsPrec :: Int -> DraftMessageContent -> ShowS
$cshow :: DraftMessageContent -> String
show :: DraftMessageContent -> String
$cshowList :: [DraftMessageContent] -> ShowS
showList :: [DraftMessageContent] -> ShowS
Show)

instance I.ShortShow DraftMessageContent where
  shortShow :: DraftMessageContent -> String
shortShow DraftMessageContentText
    { text :: DraftMessageContent -> Maybe FormattedText
text                 = Maybe FormattedText
text_
    , link_preview_options :: DraftMessageContent -> Maybe LinkPreviewOptions
link_preview_options = Maybe LinkPreviewOptions
link_preview_options_
    }
      = String
"DraftMessageContentText"
        String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
I.cc
        [ String
"text"                 String -> Maybe FormattedText -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe FormattedText
text_
        , String
"link_preview_options" String -> Maybe LinkPreviewOptions -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe LinkPreviewOptions
link_preview_options_
        ]
  shortShow DraftMessageContentRichMessage
    { message :: DraftMessageContent -> Maybe RichMessage
message = Maybe RichMessage
message_
    }
      = String
"DraftMessageContentRichMessage"
        String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
I.cc
        [ String
"message" String -> Maybe RichMessage -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe RichMessage
message_
        ]
  shortShow DraftMessageContentVideoNote
    { file_path :: DraftMessageContent -> Maybe Text
file_path          = Maybe Text
file_path_
    , duration :: DraftMessageContent -> Maybe Int
duration           = Maybe Int
duration_
    , _length :: DraftMessageContent -> Maybe Int
_length            = Maybe Int
_length_
    , self_destruct_type :: DraftMessageContent -> Maybe MessageSelfDestructType
self_destruct_type = Maybe MessageSelfDestructType
self_destruct_type_
    }
      = String
"DraftMessageContentVideoNote"
        String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
I.cc
        [ String
"file_path"          String -> Maybe Text -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Text
file_path_
        , String
"duration"           String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
duration_
        , String
"_length"            String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
_length_
        , String
"self_destruct_type" String -> Maybe MessageSelfDestructType -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe MessageSelfDestructType
self_destruct_type_
        ]
  shortShow DraftMessageContentVoiceNote
    { file_path :: DraftMessageContent -> Maybe Text
file_path          = Maybe Text
file_path_
    , duration :: DraftMessageContent -> Maybe Int
duration           = Maybe Int
duration_
    , waveform :: DraftMessageContent -> Maybe ByteString
waveform           = Maybe ByteString
waveform_
    , self_destruct_type :: DraftMessageContent -> Maybe MessageSelfDestructType
self_destruct_type = Maybe MessageSelfDestructType
self_destruct_type_
    }
      = String
"DraftMessageContentVoiceNote"
        String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
I.cc
        [ String
"file_path"          String -> Maybe Text -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Text
file_path_
        , String
"duration"           String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
duration_
        , String
"waveform"           String -> Maybe ByteString -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe ByteString
waveform_
        , String
"self_destruct_type" String -> Maybe MessageSelfDestructType -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe MessageSelfDestructType
self_destruct_type_
        ]

instance AT.FromJSON DraftMessageContent where
  parseJSON :: Value -> Parser DraftMessageContent
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
"draftMessageContentText"        -> Value -> Parser DraftMessageContent
parseDraftMessageContentText Value
v
      String
"draftMessageContentRichMessage" -> Value -> Parser DraftMessageContent
parseDraftMessageContentRichMessage Value
v
      String
"draftMessageContentVideoNote"   -> Value -> Parser DraftMessageContent
parseDraftMessageContentVideoNote Value
v
      String
"draftMessageContentVoiceNote"   -> Value -> Parser DraftMessageContent
parseDraftMessageContentVoiceNote Value
v
      String
_                                -> Parser DraftMessageContent
forall a. Monoid a => a
mempty
    
    where
      parseDraftMessageContentText :: A.Value -> AT.Parser DraftMessageContent
      parseDraftMessageContentText :: Value -> Parser DraftMessageContent
parseDraftMessageContentText = String
-> (Object -> Parser DraftMessageContent)
-> Value
-> Parser DraftMessageContent
forall a. String -> (Object -> Parser a) -> Value -> Parser a
A.withObject String
"DraftMessageContentText" ((Object -> Parser DraftMessageContent)
 -> Value -> Parser DraftMessageContent)
-> (Object -> Parser DraftMessageContent)
-> Value
-> Parser DraftMessageContent
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
        Maybe FormattedText
text_                 <- Object
o Object -> Key -> Parser (Maybe FormattedText)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?  Key
"text"
        Maybe LinkPreviewOptions
link_preview_options_ <- Object
o Object -> Key -> Parser (Maybe LinkPreviewOptions)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?  Key
"link_preview_options"
        DraftMessageContent -> Parser DraftMessageContent
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DraftMessageContent -> Parser DraftMessageContent)
-> DraftMessageContent -> Parser DraftMessageContent
forall a b. (a -> b) -> a -> b
$ DraftMessageContentText
          { text :: Maybe FormattedText
text                 = Maybe FormattedText
text_
          , link_preview_options :: Maybe LinkPreviewOptions
link_preview_options = Maybe LinkPreviewOptions
link_preview_options_
          }
      parseDraftMessageContentRichMessage :: A.Value -> AT.Parser DraftMessageContent
      parseDraftMessageContentRichMessage :: Value -> Parser DraftMessageContent
parseDraftMessageContentRichMessage = String
-> (Object -> Parser DraftMessageContent)
-> Value
-> Parser DraftMessageContent
forall a. String -> (Object -> Parser a) -> Value -> Parser a
A.withObject String
"DraftMessageContentRichMessage" ((Object -> Parser DraftMessageContent)
 -> Value -> Parser DraftMessageContent)
-> (Object -> Parser DraftMessageContent)
-> Value
-> Parser DraftMessageContent
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
        Maybe RichMessage
message_ <- Object
o Object -> Key -> Parser (Maybe RichMessage)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?  Key
"message"
        DraftMessageContent -> Parser DraftMessageContent
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DraftMessageContent -> Parser DraftMessageContent)
-> DraftMessageContent -> Parser DraftMessageContent
forall a b. (a -> b) -> a -> b
$ DraftMessageContentRichMessage
          { message :: Maybe RichMessage
message = Maybe RichMessage
message_
          }
      parseDraftMessageContentVideoNote :: A.Value -> AT.Parser DraftMessageContent
      parseDraftMessageContentVideoNote :: Value -> Parser DraftMessageContent
parseDraftMessageContentVideoNote = String
-> (Object -> Parser DraftMessageContent)
-> Value
-> Parser DraftMessageContent
forall a. String -> (Object -> Parser a) -> Value -> Parser a
A.withObject String
"DraftMessageContentVideoNote" ((Object -> Parser DraftMessageContent)
 -> Value -> Parser DraftMessageContent)
-> (Object -> Parser DraftMessageContent)
-> Value
-> Parser DraftMessageContent
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
        Maybe Text
file_path_          <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?  Key
"file_path"
        Maybe Int
duration_           <- Object
o Object -> Key -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?  Key
"duration"
        Maybe Int
_length_            <- Object
o Object -> Key -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?  Key
"length"
        Maybe MessageSelfDestructType
self_destruct_type_ <- Object
o Object -> Key -> Parser (Maybe MessageSelfDestructType)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?  Key
"self_destruct_type"
        DraftMessageContent -> Parser DraftMessageContent
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DraftMessageContent -> Parser DraftMessageContent)
-> DraftMessageContent -> Parser DraftMessageContent
forall a b. (a -> b) -> a -> b
$ DraftMessageContentVideoNote
          { file_path :: Maybe Text
file_path          = Maybe Text
file_path_
          , duration :: Maybe Int
duration           = Maybe Int
duration_
          , _length :: Maybe Int
_length            = Maybe Int
_length_
          , self_destruct_type :: Maybe MessageSelfDestructType
self_destruct_type = Maybe MessageSelfDestructType
self_destruct_type_
          }
      parseDraftMessageContentVoiceNote :: A.Value -> AT.Parser DraftMessageContent
      parseDraftMessageContentVoiceNote :: Value -> Parser DraftMessageContent
parseDraftMessageContentVoiceNote = String
-> (Object -> Parser DraftMessageContent)
-> Value
-> Parser DraftMessageContent
forall a. String -> (Object -> Parser a) -> Value -> Parser a
A.withObject String
"DraftMessageContentVoiceNote" ((Object -> Parser DraftMessageContent)
 -> Value -> Parser DraftMessageContent)
-> (Object -> Parser DraftMessageContent)
-> Value
-> Parser DraftMessageContent
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
        Maybe Text
file_path_          <- Object
o Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"file_path"
        Maybe Int
duration_           <- Object
o Object -> Key -> Parser (Maybe Int)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"duration"
        Maybe ByteString
waveform_           <- (String -> ByteString) -> Maybe String -> Maybe ByteString
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> ByteString
I.readBytes (Maybe String -> Maybe ByteString)
-> Parser (Maybe String) -> Parser (Maybe ByteString)
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
"waveform"
        Maybe MessageSelfDestructType
self_destruct_type_ <- Object
o Object -> Key -> Parser (Maybe MessageSelfDestructType)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
A..:?                       Key
"self_destruct_type"
        DraftMessageContent -> Parser DraftMessageContent
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (DraftMessageContent -> Parser DraftMessageContent)
-> DraftMessageContent -> Parser DraftMessageContent
forall a b. (a -> b) -> a -> b
$ DraftMessageContentVoiceNote
          { file_path :: Maybe Text
file_path          = Maybe Text
file_path_
          , duration :: Maybe Int
duration           = Maybe Int
duration_
          , waveform :: Maybe ByteString
waveform           = Maybe ByteString
waveform_
          , self_destruct_type :: Maybe MessageSelfDestructType
self_destruct_type = Maybe MessageSelfDestructType
self_destruct_type_
          }
  parseJSON Value
_ = Parser DraftMessageContent
forall a. Monoid a => a
mempty

instance AT.ToJSON DraftMessageContent where
  toJSON :: DraftMessageContent -> Value
toJSON DraftMessageContentText
    { text :: DraftMessageContent -> Maybe FormattedText
text                 = Maybe FormattedText
text_
    , link_preview_options :: DraftMessageContent -> Maybe LinkPreviewOptions
link_preview_options = Maybe LinkPreviewOptions
link_preview_options_
    }
      = [Pair] -> Value
A.object
        [ Key
"@type"                Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Text -> Value
AT.String Text
"draftMessageContentText"
        , Key
"text"                 Key -> Maybe FormattedText -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe FormattedText
text_
        , Key
"link_preview_options" Key -> Maybe LinkPreviewOptions -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe LinkPreviewOptions
link_preview_options_
        ]
  toJSON DraftMessageContentRichMessage
    { message :: DraftMessageContent -> Maybe RichMessage
message = Maybe RichMessage
message_
    }
      = [Pair] -> Value
A.object
        [ Key
"@type"   Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Text -> Value
AT.String Text
"draftMessageContentRichMessage"
        , Key
"message" Key -> Maybe RichMessage -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe RichMessage
message_
        ]
  toJSON DraftMessageContentVideoNote
    { file_path :: DraftMessageContent -> Maybe Text
file_path          = Maybe Text
file_path_
    , duration :: DraftMessageContent -> Maybe Int
duration           = Maybe Int
duration_
    , _length :: DraftMessageContent -> Maybe Int
_length            = Maybe Int
_length_
    , self_destruct_type :: DraftMessageContent -> Maybe MessageSelfDestructType
self_destruct_type = Maybe MessageSelfDestructType
self_destruct_type_
    }
      = [Pair] -> Value
A.object
        [ Key
"@type"              Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Text -> Value
AT.String Text
"draftMessageContentVideoNote"
        , Key
"file_path"          Key -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Text
file_path_
        , Key
"duration"           Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
duration_
        , Key
"length"             Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
_length_
        , Key
"self_destruct_type" Key -> Maybe MessageSelfDestructType -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe MessageSelfDestructType
self_destruct_type_
        ]
  toJSON DraftMessageContentVoiceNote
    { file_path :: DraftMessageContent -> Maybe Text
file_path          = Maybe Text
file_path_
    , duration :: DraftMessageContent -> Maybe Int
duration           = Maybe Int
duration_
    , waveform :: DraftMessageContent -> Maybe ByteString
waveform           = Maybe ByteString
waveform_
    , self_destruct_type :: DraftMessageContent -> Maybe MessageSelfDestructType
self_destruct_type = Maybe MessageSelfDestructType
self_destruct_type_
    }
      = [Pair] -> Value
A.object
        [ Key
"@type"              Key -> Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Text -> Value
AT.String Text
"draftMessageContentVoiceNote"
        , Key
"file_path"          Key -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Text
file_path_
        , Key
"duration"           Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
duration_
        , Key
"waveform"           Key -> Maybe Value -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= (ByteString -> Value) -> Maybe ByteString -> Maybe Value
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ByteString -> Value
I.writeBytes  Maybe ByteString
waveform_
        , Key
"self_destruct_type" Key -> Maybe MessageSelfDestructType -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe MessageSelfDestructType
self_destruct_type_
        ]