-- | The @user@ element of a OSM file.
module Data.Geo.OSM.User
(
  User
, user
) where

import Text.XML.HXT.Arrow.Pickle
import Data.Geo.OSM.Home
import Data.Geo.OSM.Lens.HomeL
import Data.Geo.OSM.Lens.DisplayNameL
import Data.Geo.OSM.Lens.AccountCreatedL
import Data.Lens.Common
import Control.Comonad.Trans.Store

-- | The @user@ element of a OSM file.
data User =
  User (Maybe Home) String String
  deriving Eq

-- | Constructs a @user@ with an optional home, display_name and account_created.
user ::
  Maybe Home -- ^ The @home@ element.
  -> String -- ^ The @display_name@ attribute.
  -> String -- ^ The @account_created@ attribute.
  -> User
user =
  User

instance XmlPickler User where
  xpickle =
    xpElem "user" (xpWrap (\(home', dn', ac') -> user home' dn' ac', \(User home' dn' ac') -> (home', dn', ac')) (xpTriple (xpOption (xpElem "home" xpickle)) (xpAttr "display_name" xpText) (xpAttr "account_created" xpText)))

instance Show User where
  show =
    showPickled []

instance HomeL User where
  homeL =
    Lens $ \(User home displayName accountCreated) -> store (\home -> User home displayName accountCreated) home

instance DisplayNameL User where
  displayNameL =
    Lens $ \(User home displayName accountCreated) -> store (\displayName -> User home displayName accountCreated) displayName

instance AccountCreatedL User where
  accountCreatedL =
    Lens $ \(User home displayName accountCreated) -> store (\accountCreated -> User home displayName accountCreated) accountCreated