-- | Amount (de)serialization
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}

module AmountSpec
  where

import Blockfrost.Types.Shared.Amount
import Data.Aeson (decode, encode)
import Data.Default
import qualified Money
import Test.Hspec
import Test.Tasty.Hspec
import Text.RawString.QQ

spec_sample :: Spec
spec_sample = do
  it "my samples decodes to expected value" $ do
    decode mySamples `shouldBe` Just mySamplesExpected
  it "doc samples decodes to expected value" $ do
    decode docSamples `shouldBe` Just docSamplesExpected

mySamples = [r|
[
    { "unit":"lovelace"
    , "quantity":"42000000"
    }

  , { "unit":"b0d07d45fe9514f80213f4020e5a61241458be626841cde717cb38a76e7574636f696e"
    , "quantity":"12"
    }

  , { "unit":"6804edf9712d2b619edb6ac86861fe93a730693183a262b165fcc1ba1bc99cad"
    , "quantity":"18605647"
    }
]
|]

mySamplesExpected =
  [ AdaAmount 42000000
  , AssetAmount
      $ Money.toSomeDiscrete
        (12 :: Money.Discrete'
                  "b0d07d45fe9514f80213f4020e5a61241458be626841cde717cb38a76e7574636f696e"
                  '(1,1))
  , AssetAmount
      $ Money.toSomeDiscrete
        (18605647 :: Money.Discrete'
                        "6804edf9712d2b619edb6ac86861fe93a730693183a262b165fcc1ba1bc99cad"
                        '(1,1))
  ]

docSamples = [r|
[
    {
        "unit": "lovelace",
        "quantity": "42000000"
    },
    {
        "unit": "b0d07d45fe9514f80213f4020e5a61241458be626841cde717cb38a76e7574636f696e",
        "quantity": "12"
    }
]
|]

docSamplesExpected =
  [ AdaAmount 42000000
  , AssetAmount
      $ Money.toSomeDiscrete
        (12 :: Money.Discrete'
                  "b0d07d45fe9514f80213f4020e5a61241458be626841cde717cb38a76e7574636f696e"
                  '(1,1))
  ]