{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE RecordWildCards     #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE TypeOperators       #-}
{-# LANGUAGE DeriveGeneric       #-}

-- | Auto generated module by json-autotype
module Json.SubmitMediaTypes where

import           System.Exit        (exitFailure, exitSuccess)
import           System.IO          (stderr, hPutStrLn)
import qualified Data.ByteString.Lazy.Char8 as BSL
import           Data.ByteString.Lazy
import           System.Environment (getArgs)
import           Control.Monad      (forM_, mzero, join)
import           Control.Applicative
import           Data.Aeson.AutoType.Alternative
import           Data.Aeson(eitherDecode, Value(..), FromJSON(..), ToJSON(..),
                            pairs,
                            (.:), (.:?), (.=), object)
import           Data.Monoid
import           Data.Text (Text)
import qualified GHC.Generics

-- | Workaround for https://github.com/bos/aeson/issues/287.
o .:?? val = fmap join (o .:? val)


data Self = Self { 
    selfHref :: Text
  } deriving (Show,Eq,GHC.Generics.Generic)


instance FromJSON Self where
  parseJSON (Object v) = Self <$> v .:   "href"
  parseJSON _          = mzero


instance ToJSON Self where
  toJSON     (Self {..}) = object ["href" .= selfHref]
  toEncoding (Self {..}) = pairs  ("href" .= selfHref)


data Links = Links { 
    linksSelf :: Self
  } deriving (Show,Eq,GHC.Generics.Generic)


instance FromJSON Links where
  parseJSON (Object v) = Links <$> v .:   "self"
  parseJSON _          = mzero


instance ToJSON Links where
  toJSON     (Links {..}) = object ["self" .= linksSelf]
  toEncoding (Links {..}) = pairs  ("self" .= linksSelf)


data Metadata = Metadata { 

  } deriving (Show,Eq,GHC.Generics.Generic)


instance FromJSON Metadata where
  parseJSON (Object v) = return  Metadata
  parseJSON _          = mzero


instance ToJSON Metadata where
  toJSON     (Metadata {}) = object []



data TopLevel = TopLevel { 
    topLevelStatus :: Text,
    topLevelMediaId :: Text,
    topLevelLinks :: Links,
    topLevelMetadata :: Metadata
  } deriving (Show,Eq,GHC.Generics.Generic)


instance FromJSON TopLevel where
  parseJSON (Object v) = TopLevel <$> v .:   "status" <*> v .:   "mediaId" <*> v .:   "_links" <*> v .:   "metadata"
  parseJSON _          = mzero


instance ToJSON TopLevel where
  toJSON     (TopLevel {..}) = object ["status" .= topLevelStatus, "mediaId" .= topLevelMediaId, "_links" .= topLevelLinks, "metadata" .= topLevelMetadata]
  toEncoding (TopLevel {..}) = pairs  ("status" .= topLevelStatus<>"mediaId" .= topLevelMediaId<>"_links" .= topLevelLinks<>"metadata" .= topLevelMetadata)



parse :: ByteString -> Either String TopLevel
parse = eitherDecode