module Arbor.File.Format.Asif.Type where

import Arbor.File.Format.Asif.Format   (Format)
import Arbor.File.Format.Asif.Maybe
import Arbor.File.Format.Asif.Whatever
import Data.Semigroup
import Data.Text                       (Text)
import Data.Thyme.Clock.POSIX          (POSIXTime)

data SegmentMeta = SegmentMeta
  { _segmentMetaCreateTime :: Maybe POSIXTime
  , _segmentMetaFilename   :: Maybe Text
  , _segmentMetaFormat     :: Maybe (Whatever Format)
  } deriving (Eq, Show)

instance Semigroup SegmentMeta where
  a <> b =  SegmentMeta
    { _segmentMetaCreateTime = _segmentMetaCreateTime a `secondJust` _segmentMetaCreateTime b
    , _segmentMetaFilename   = _segmentMetaFilename   a `secondJust` _segmentMetaFilename   b
    , _segmentMetaFormat     = _segmentMetaFormat     a `secondJust` _segmentMetaFormat     b
    }

instance Monoid SegmentMeta where
  mappend = (<>)
  mempty = SegmentMeta
    { _segmentMetaCreateTime = Nothing
    , _segmentMetaFilename   = Nothing
    , _segmentMetaFormat     = Nothing
    }

data Segment a = Segment
  { _segmentMeta    :: SegmentMeta
  , _segmentPayload :: a
  }

segment :: a -> SegmentMeta -> Segment a
segment payload meta = Segment
  { _segmentMeta      = meta
  , _segmentPayload   = payload
  }

metaCreateTime :: POSIXTime -> SegmentMeta
metaCreateTime time = mempty
  { _segmentMetaCreateTime = Just time
  }

metaFilename :: Text -> SegmentMeta
metaFilename filePath = mempty
  { _segmentMetaFilename = Just filePath
  }

metaFormat :: Whatever Format -> SegmentMeta
metaFormat format = mempty
  { _segmentMetaFormat = Just format
  }

metaMaybeFormat :: Maybe (Whatever Format) -> SegmentMeta
metaMaybeFormat maybeFormat = mempty
  { _segmentMetaFormat = maybeFormat
  }