{-# LANGUAGE MultiParamTypeClasses, TypeSynonymInstances #-}

-- | The @gpx_file@ element of a OSM file.
module Data.Geo.OSM.GpxFile(
                             GpxFile,
                             gpxFile
                           ) where

import Text.XML.HXT.Arrow
import Text.XML.HXT.Extras
import Data.Char
import Data.Geo.OSM.Accessor.Id
import Data.Geo.OSM.Accessor.Name
import Data.Geo.OSM.Accessor.Lat
import Data.Geo.OSM.Accessor.Lon
import Data.Geo.OSM.Accessor.User
import Data.Geo.OSM.Accessor.Public
import Data.Geo.OSM.Accessor.Pending
import Data.Geo.OSM.Accessor.Timestamp

-- | The @gpx_file@ element of a OSM file.
data GpxFile = GpxFile String String String String String Bool Bool String
  deriving Eq

-- | Constructs a @gpx_file@ with an id, name, lat, lon, user, public, pending and timestamp.
gpxFile
  :: String -- ^ The @id@ attribute.
     -> String -- ^ The @name@ attribute.
     -> String -- ^ The @lat@ attribute.
     -> String -- ^ The @lon@ attribute.
     -> String -- ^ The @user@ attribute.
     -> Bool -- ^ The @public@ attribute.
     -> Bool -- ^ The @pending@ attribute.
     -> String -- ^ The @timestamp@ attribute.
     -> GpxFile
gpxFile = GpxFile

instance XmlPickler GpxFile where
  xpickle = let b = xpWrapMaybe (\s -> case fmap toLower s of "true" -> Just True
                                                              "false" -> Just False
                                                              _ -> Nothing, (fmap toLower) . show)
            in xpElem "gpx_file" (xpWrap (\(id', name', lat', lon', user', public', pending', timestamp') -> gpxFile id' name' lat' lon' user' public' pending' timestamp', undefined) (xp8Tuple (xpAttr "id" xpText) (xpAttr "name" xpText) (xpAttr "lat" xpText) (xpAttr "lon" xpText) (xpAttr "user" xpText) (xpDefault False (b (xpAttr "public" xpText))) (xpDefault False (b (xpAttr "pending" xpText))) (xpAttr "timestamp" xpText)))

instance Show GpxFile where
  show = showPickled []

instance Id GpxFile where
  id (GpxFile x _ _ _ _ _ _ _) = x
  setId a (GpxFile _ b c d e f g h) = gpxFile a b c d e f g h

instance Name GpxFile where
  name (GpxFile _ x _ _ _ _ _ _) = x
  setName b (GpxFile a _ c d e f g h) = gpxFile a b c d e f g h

instance Lat GpxFile where
  lat (GpxFile _ _ x _ _ _ _ _) = x
  setLat c (GpxFile a b _ d e f g h) = gpxFile a b c d e f g h

instance Lon GpxFile where
  lon (GpxFile _ _ _ x _ _ _ _) = x
  setLon d (GpxFile a b c _ e f g h) = gpxFile a b c d e f g h

instance User GpxFile String where
  user (GpxFile _ _ _ _ x _ _ _) = x
  setUser e (GpxFile a b c d _ f g h) = gpxFile a b c d e f g h

instance Public GpxFile where
  public (GpxFile _ _ _ _ _ x _ _) = x
  setPublic f (GpxFile a b c d e _ g h) = gpxFile a b c d e f g h

instance Pending GpxFile where
  pending (GpxFile _ _ _ _ _ _ x _) = x
  setPending g (GpxFile a b c d e f _ h) = gpxFile a b c d e f g h

instance Timestamp GpxFile String where
  timestamp (GpxFile _ _ _ _ _ _ _ x) = x
  setTimestamp h (GpxFile a b c d e f g _) = gpxFile a b c d e f g h