{-# LANGUAGE DeriveAnyClass      #-}
{-# LANGUAGE DeriveGeneric       #-}
{-# LANGUAGE DeriveTraversable   #-}
{-# LANGUAGE NumDecimals         #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE QuasiQuotes         #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving  #-}
{-# LANGUAGE StrictData          #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE TupleSections       #-}
{-# LANGUAGE TypeApplications    #-}

module Avro.Data.Karma
where

import Data.Avro.Deriving (deriveAvroFromByteString, r)

import Hedgehog
import Hedgehog.Gen   as Gen
import Hedgehog.Range as Range

deriveAvroFromByteString [r|
[{
    "type": "record",
    "name": "Blessing",
    "namespace": "avro.test.data",
    "fields": [
      { "name": "geo",
        "type": ["null", {
          "type": "record",
          "name": "Geo",
          "fields": [
            { "name": "source", "type": "string" },
            { "name": "dest", "type": "string" }
          ]
        }]
      }
    ]
  },
  {
    "type": "record",
    "name": "Curse",
    "namespace": "avro.test.data",
    "fields": [
      { "name": "geo", "type": ["null", "Geo"] }
    ]
  }
]
|]

geoGen :: MonadGen m => m Geo
geoGen = do
  src <- Gen.element ["AU", "CN", "DE", "KZ", "LU"]
  dst <- Gen.element ["BE", "LX", "NZ", "NL", "UK"]
  pure $ Geo src dst

blessingGen :: MonadGen m => m Blessing
blessingGen = Blessing <$> Gen.maybe geoGen

curseGen :: MonadGen m => m Curse
curseGen = Curse <$> Gen.maybe geoGen
