{-# LANGUAGE DeriveAnyClass             #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE DerivingStrategies         #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Package.C.Db.Type ( BuildCfg (..)
                         , InstallDb (..)
                         -- * Lenses
                         , installedPackages
                         ) where

import           CPkgPrelude
import           Data.Semigroup
import qualified Data.Set       as S
import qualified Data.Text      as T
import           Package.C.Type

-- TODO: we definitely want something different here - it should allow garbage
-- collection, for one
newtype InstallDb = InstallDb { _installedPackages :: S.Set BuildCfg }
    deriving newtype (Semigroup, Monoid, Binary)

installedPackages :: Lens' InstallDb (S.Set BuildCfg)
installedPackages f s = fmap (\x -> s { _installedPackages = x }) (f (_installedPackages s))

data BuildCfg = BuildCfg { buildName       :: String
                         , buildVersion    :: Version
                         , pinnedBuildDeps :: [(T.Text, Version)]
                         , pinnedDeps      :: [(T.Text, Version)]
                         , targetArch      :: Maybe TargetTriple
                         , global          :: Bool
                         , configureCmds   :: [ Command ]
                         , buildCmds       :: [ Command ]
                         , installCmds     :: [ Command ]
                         } deriving (Eq, Ord, Generic, Binary, Hashable)