{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
module GEODE.Metadata.Work
  ( Work(..) ) where

import Data.Aeson (FromJSON(..), ToJSON(..), withText)
import Data.ByteString.Char8 as ByteString (unpack)
import Data.Csv (FromField(..), ToField(..))
import Data.Char (toLower)
import Data.Text as Text (unpack)
import GHC.Generics (Generic)

data Work = EDdA | LGE | Wikipedia deriving (Eq, Generic, Ord, Show)

tolerantParser :: (Applicative m, Monoid (m Work)) => String -> m Work
tolerantParser = recognize . fmap toLower
  where
    recognize "edda" = pure EDdA
    recognize "lge" = pure LGE
    recognize "wikipedia" = pure Wikipedia
    recognize _ = mempty

instance FromField Work where
  parseField = tolerantParser . ByteString.unpack

instance ToField Work where
  toField = toField . show

instance ToJSON Work
instance FromJSON Work where
  parseJSON = withText "Work" $ tolerantParser . Text.unpack