module TD.Query.SendTonWalletTransfer
  (SendTonWalletTransfer(..)
  , defaultSendTonWalletTransfer
  ) where

import qualified Data.Aeson as A
import qualified Data.Aeson.Types as AT
import qualified TD.Lib.Internal as I
import qualified Data.Text as T
import qualified Data.ByteString as BS

-- | Sends a cryptocurrency from the user's TON wallet; can be used only if getOption("can_use_ton_wallet"). Returns 'TD.Data.TonWalletTransferResult.TonWalletTransferResult'
data SendTonWalletTransfer
  = SendTonWalletTransfer
    { SendTonWalletTransfer -> Maybe Int
user_id               :: Maybe Int           -- ^ Identifier of the user who will receive the transfer; pass 0 if unknown
    , SendTonWalletTransfer -> Maybe Text
address               :: Maybe T.Text        -- ^ Address in the TON blockchain of the transaction peer
    , SendTonWalletTransfer -> Maybe Int
amount                :: Maybe Int           -- ^ The amount of the sent cryptocurrency, in the smallest units of the cryptocurrency
    , SendTonWalletTransfer -> Maybe Text
comment               :: Maybe T.Text        -- ^ Comment added to the transaction
    , SendTonWalletTransfer -> Maybe Bool
is_comment_encrypted  :: Maybe Bool          -- ^ Pass true if the comment is encrypted and must be decrypted using the receiver's or sender's private key
    , SendTonWalletTransfer -> Maybe Int
sending_id            :: Maybe Int           -- ^ Non-persistent identifier, which will be returned back in messageSendingStatePending object and can be used to match sent messages and corresponding updateNewMessage updates
    , SendTonWalletTransfer -> Maybe ByteString
regular_transfer_data :: Maybe BS.ByteString -- ^ Serialized data for regular cryptocurrency transfer request. The minimum allowed transfer amount is getOption("ton_wallet_transfer_amount_min")
    , SendTonWalletTransfer -> Maybe ByteString
gasless_transfer_data :: Maybe BS.ByteString -- ^ Serialized data for gasless cryptocurrency transfer request; pass an empty string to force a regular request. The minimum allowed transfer amount for a gasless transfer is getOption("ton_wallet_gasless_transfer_amount_min")
    }
  deriving (SendTonWalletTransfer -> SendTonWalletTransfer -> Bool
(SendTonWalletTransfer -> SendTonWalletTransfer -> Bool)
-> (SendTonWalletTransfer -> SendTonWalletTransfer -> Bool)
-> Eq SendTonWalletTransfer
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SendTonWalletTransfer -> SendTonWalletTransfer -> Bool
== :: SendTonWalletTransfer -> SendTonWalletTransfer -> Bool
$c/= :: SendTonWalletTransfer -> SendTonWalletTransfer -> Bool
/= :: SendTonWalletTransfer -> SendTonWalletTransfer -> Bool
Eq, Int -> SendTonWalletTransfer -> ShowS
[SendTonWalletTransfer] -> ShowS
SendTonWalletTransfer -> String
(Int -> SendTonWalletTransfer -> ShowS)
-> (SendTonWalletTransfer -> String)
-> ([SendTonWalletTransfer] -> ShowS)
-> Show SendTonWalletTransfer
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SendTonWalletTransfer -> ShowS
showsPrec :: Int -> SendTonWalletTransfer -> ShowS
$cshow :: SendTonWalletTransfer -> String
show :: SendTonWalletTransfer -> String
$cshowList :: [SendTonWalletTransfer] -> ShowS
showList :: [SendTonWalletTransfer] -> ShowS
Show)

instance I.ShortShow SendTonWalletTransfer where
  shortShow :: SendTonWalletTransfer -> String
shortShow
    SendTonWalletTransfer
      { user_id :: SendTonWalletTransfer -> Maybe Int
user_id               = Maybe Int
user_id_
      , address :: SendTonWalletTransfer -> Maybe Text
address               = Maybe Text
address_
      , amount :: SendTonWalletTransfer -> Maybe Int
amount                = Maybe Int
amount_
      , comment :: SendTonWalletTransfer -> Maybe Text
comment               = Maybe Text
comment_
      , is_comment_encrypted :: SendTonWalletTransfer -> Maybe Bool
is_comment_encrypted  = Maybe Bool
is_comment_encrypted_
      , sending_id :: SendTonWalletTransfer -> Maybe Int
sending_id            = Maybe Int
sending_id_
      , regular_transfer_data :: SendTonWalletTransfer -> Maybe ByteString
regular_transfer_data = Maybe ByteString
regular_transfer_data_
      , gasless_transfer_data :: SendTonWalletTransfer -> Maybe ByteString
gasless_transfer_data = Maybe ByteString
gasless_transfer_data_
      }
        = String
"SendTonWalletTransfer"
          String -> ShowS
forall a. [a] -> [a] -> [a]
++ [String] -> String
I.cc
          [ String
"user_id"               String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
user_id_
          , String
"address"               String -> Maybe Text -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Text
address_
          , String
"amount"                String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
amount_
          , String
"comment"               String -> Maybe Text -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Text
comment_
          , String
"is_comment_encrypted"  String -> Maybe Bool -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Bool
is_comment_encrypted_
          , String
"sending_id"            String -> Maybe Int -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe Int
sending_id_
          , String
"regular_transfer_data" String -> Maybe ByteString -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe ByteString
regular_transfer_data_
          , String
"gasless_transfer_data" String -> Maybe ByteString -> String
forall a. ShortShow a => String -> Maybe a -> String
`I.p` Maybe ByteString
gasless_transfer_data_
          ]

instance AT.ToJSON SendTonWalletTransfer where
  toJSON :: SendTonWalletTransfer -> Value
toJSON
    SendTonWalletTransfer
      { user_id :: SendTonWalletTransfer -> Maybe Int
user_id               = Maybe Int
user_id_
      , address :: SendTonWalletTransfer -> Maybe Text
address               = Maybe Text
address_
      , amount :: SendTonWalletTransfer -> Maybe Int
amount                = Maybe Int
amount_
      , comment :: SendTonWalletTransfer -> Maybe Text
comment               = Maybe Text
comment_
      , is_comment_encrypted :: SendTonWalletTransfer -> Maybe Bool
is_comment_encrypted  = Maybe Bool
is_comment_encrypted_
      , sending_id :: SendTonWalletTransfer -> Maybe Int
sending_id            = Maybe Int
sending_id_
      , regular_transfer_data :: SendTonWalletTransfer -> Maybe ByteString
regular_transfer_data = Maybe ByteString
regular_transfer_data_
      , gasless_transfer_data :: SendTonWalletTransfer -> Maybe ByteString
gasless_transfer_data = Maybe ByteString
gasless_transfer_data_
      }
        = [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
"sendTonWalletTransfer"
          , Key
"user_id"               Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
user_id_
          , Key
"address"               Key -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Text
address_
          , Key
"amount"                Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
amount_
          , Key
"comment"               Key -> Maybe Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Text
comment_
          , Key
"is_comment_encrypted"  Key -> Maybe Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Bool
is_comment_encrypted_
          , Key
"sending_id"            Key -> Maybe Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
forall v. ToJSON v => Key -> v -> Pair
A..= Maybe Int
sending_id_
          , Key
"regular_transfer_data" 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
regular_transfer_data_
          , Key
"gasless_transfer_data" 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
gasless_transfer_data_
          ]

defaultSendTonWalletTransfer :: SendTonWalletTransfer
defaultSendTonWalletTransfer :: SendTonWalletTransfer
defaultSendTonWalletTransfer =
  SendTonWalletTransfer
    { user_id :: Maybe Int
user_id               = Maybe Int
forall a. Maybe a
Nothing
    , address :: Maybe Text
address               = Maybe Text
forall a. Maybe a
Nothing
    , amount :: Maybe Int
amount                = Maybe Int
forall a. Maybe a
Nothing
    , comment :: Maybe Text
comment               = Maybe Text
forall a. Maybe a
Nothing
    , is_comment_encrypted :: Maybe Bool
is_comment_encrypted  = Maybe Bool
forall a. Maybe a
Nothing
    , sending_id :: Maybe Int
sending_id            = Maybe Int
forall a. Maybe a
Nothing
    , regular_transfer_data :: Maybe ByteString
regular_transfer_data = Maybe ByteString
forall a. Maybe a
Nothing
    , gasless_transfer_data :: Maybe ByteString
gasless_transfer_data = Maybe ByteString
forall a. Maybe a
Nothing
    }