{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}


module MPD.Current.JSON.Parse
    ( getTags
    ) where

import MPD.Current.JSON.Types ( Tags(..), TagField(..) )
import Network.MPD ( Metadata(..) )
import qualified Network.MPD as MPD


-- | Builder for `Tags' from `Network.MPD.Song' that assigns `TagField' values
-- based on them being a single string or multi-value array.
getTags :: MPD.Song -> Tags
getTags :: Song -> Tags
getTags Song
song = Tags
  { artist :: Maybe TagField
artist                    = Metadata -> Song -> Maybe TagField
getTag Metadata
Artist                     Song
song
  , artistSort :: Maybe TagField
artistSort                = Metadata -> Song -> Maybe TagField
getTag Metadata
ArtistSort                 Song
song
  , album :: Maybe TagField
album                     = Metadata -> Song -> Maybe TagField
getTag Metadata
Album                      Song
song
  , albumSort :: Maybe TagField
albumSort                 = Metadata -> Song -> Maybe TagField
getTag Metadata
AlbumSort                  Song
song
  , albumArtist :: Maybe TagField
albumArtist               = Metadata -> Song -> Maybe TagField
getTag Metadata
AlbumArtist                Song
song
  , albumArtistSort :: Maybe TagField
albumArtistSort           = Metadata -> Song -> Maybe TagField
getTag Metadata
AlbumArtistSort            Song
song
  , title :: Maybe TagField
title                     = Metadata -> Song -> Maybe TagField
getTag Metadata
Title                      Song
song
  , track :: Maybe TagField
track                     = Metadata -> Song -> Maybe TagField
getTag Metadata
Track                      Song
song
  , name :: Maybe TagField
name                      = Metadata -> Song -> Maybe TagField
getTag Metadata
Name                       Song
song
  , genre :: Maybe TagField
genre                     = Metadata -> Song -> Maybe TagField
getTag Metadata
Genre                      Song
song
  , date :: Maybe TagField
date                      = Metadata -> Song -> Maybe TagField
getTag Metadata
Date                       Song
song
  , originalDate :: Maybe TagField
originalDate              = Metadata -> Song -> Maybe TagField
getTag Metadata
OriginalDate               Song
song
  , composer :: Maybe TagField
composer                  = Metadata -> Song -> Maybe TagField
getTag Metadata
Composer                   Song
song
  , performer :: Maybe TagField
performer                 = Metadata -> Song -> Maybe TagField
getTag Metadata
Performer                  Song
song
  , conductor :: Maybe TagField
conductor                 = Metadata -> Song -> Maybe TagField
getTag Metadata
Conductor                  Song
song
  , work :: Maybe TagField
work                      = Metadata -> Song -> Maybe TagField
getTag Metadata
Work                       Song
song
  , grouping :: Maybe TagField
grouping                  = Metadata -> Song -> Maybe TagField
getTag Metadata
Grouping                   Song
song
  , comment :: Maybe TagField
comment                   = Metadata -> Song -> Maybe TagField
getTag Metadata
Comment                    Song
song
  , disc :: Maybe TagField
disc                      = Metadata -> Song -> Maybe TagField
getTag Metadata
Disc                       Song
song
  , label :: Maybe TagField
label                     = Metadata -> Song -> Maybe TagField
getTag Metadata
Label                      Song
song
  , musicbrainzArtistId :: Maybe TagField
musicbrainzArtistId       = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_ARTISTID       Song
song
  , musicbrainzAlbumId :: Maybe TagField
musicbrainzAlbumId        = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_ALBUMID        Song
song
  , musicbrainzAlbumartistId :: Maybe TagField
musicbrainzAlbumartistId  = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_ALBUMARTISTID  Song
song
  , musicbrainzTrackId :: Maybe TagField
musicbrainzTrackId        = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_TRACKID        Song
song
  , musicbrainzReleasetrackId :: Maybe TagField
musicbrainzReleasetrackId = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_RELEASETRACKID Song
song
  , musicbrainzWorkId :: Maybe TagField
musicbrainzWorkId         = Metadata -> Song -> Maybe TagField
getTag Metadata
MUSICBRAINZ_WORKID         Song
song
  }


-- | Parse single or multi `Network.MPD.Value'
getTag :: Metadata -> MPD.Song -> Maybe TagField
getTag :: Metadata -> Song -> Maybe TagField
getTag Metadata
tag Song
song = Maybe [Value] -> Maybe TagField
tagSingleOrList (Metadata -> Song -> Maybe [Value]
MPD.sgGetTag Metadata
tag Song
song)
  where
    tagSingleOrList :: Maybe [MPD.Value] -> Maybe TagField
    tagSingleOrList :: Maybe [Value] -> Maybe TagField
tagSingleOrList Maybe [Value]
val = case Maybe [Value]
val of
      Just [Value
v] -> TagField -> Maybe TagField
forall a. a -> Maybe a
Just (TagField -> Maybe TagField)
-> (String -> TagField) -> String -> Maybe TagField
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> TagField
SingleTagField (String -> Maybe TagField) -> String -> Maybe TagField
forall a b. (a -> b) -> a -> b
$ Value -> String
forall a. ToString a => a -> String
MPD.toString Value
v
      Just [Value]
v -> TagField -> Maybe TagField
forall a. a -> Maybe a
Just (TagField -> Maybe TagField)
-> ([String] -> TagField) -> [String] -> Maybe TagField
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> TagField
MultiTagField ([String] -> Maybe TagField) -> [String] -> Maybe TagField
forall a b. (a -> b) -> a -> b
$ (Value -> String) -> [Value] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Value -> String
forall a. ToString a => a -> String
MPD.toString [Value]
v
      Maybe [Value]
Nothing -> Maybe TagField
forall a. Maybe a
Nothing