    {-# LANGUAGE DeriveDataTypeable #-}

    module Propellor.Types.Chroot where

    import Propellor.Types
    import Propellor.Types.Empty
    import Propellor.Types.Info

    import qualified Data.Semigroup as Sem
    import qualified Data.Map as M
    import Data.Monoid
    import Prelude

    data ChrootInfo = ChrootInfo
            { _chroots :: M.Map FilePath Host
            , _chrootCfg :: ChrootCfg
            }
            deriving (Show, Typeable)

    instance IsInfo ChrootInfo where
            propagateInfo _ = PropagateInfo False

    instance Sem.Semigroup ChrootInfo where
            old <> new = ChrootInfo
                    { _chroots = M.union (_chroots old) (_chroots new)
                    , _chrootCfg = _chrootCfg old <> _chrootCfg new
                    }

    instance Monoid ChrootInfo where
            mempty = ChrootInfo mempty mempty
            mappend = (Sem.<>)

    instance Empty ChrootInfo where
            isEmpty i = and
                    [ isEmpty (_chroots i)
                    , isEmpty (_chrootCfg i)
                    ]

    data ChrootCfg
            = NoChrootCfg
            | SystemdNspawnCfg [(String, Bool)]
            deriving (Show, Eq)

    instance Sem.Semigroup ChrootCfg where
            v <> NoChrootCfg = v
            NoChrootCfg <> v = v
            SystemdNspawnCfg l1 <> SystemdNspawnCfg l2 =
                    SystemdNspawnCfg (l1 <> l2)

    instance Monoid ChrootCfg where
            mempty = NoChrootCfg
            mappend = (Sem.<>)

    instance Empty ChrootCfg where
            isEmpty c= c == NoChrootCfg