{-# LANGUAGE OverloadedStrings #-}

module Network.Syncthing.Types.DirTree
    ( DirTree(..)
    ) where

import           Control.Applicative              ((<$>), (<*>))
import           Control.Monad                    (MonadPlus (mzero))
import           Data.Aeson                       (FromJSON, Value (..),
                                                   parseJSON)
import qualified Data.Map                         as M
import           Data.Text                        (Text)
import           Data.Time.Clock                  (UTCTime)
import           Data.Vector                      ((!))

import           Network.Syncthing.Internal.Utils (toUTC)


-- | A directory tree contains files or subdirectories.
data DirTree
    = Dir {
        getDirContents :: M.Map Text DirTree
      }
    | File {
        getModTime  :: Maybe UTCTime    -- ^ file modification time
      , getFileSize :: Integer          -- ^ file size
      }
    deriving (Eq, Show)

instance FromJSON DirTree where
    parseJSON obj@(Object _) = Dir  <$> parseJSON obj
    parseJSON (Array v)      = File <$> (toUTC <$> parseJSON (v ! 0))
                                    <*> parseJSON (v ! 1)
    parseJSON _              = mzero