module B9.B9Config.Docker
  ( dockerConfigToCPDocument,
    defaultDockerConfig,
    parseDockerConfig,
    DockerConfig (..),
    dockerNetworkId,
    dockerCapabilities,
  )
where

import B9.B9Config.Container
import Control.Lens (makeLenses)
import Data.ConfigFile.B9Extras

data DockerConfig
  = DockerConfig
      { _dockerNetworkId :: Maybe String,
        _dockerCapabilities :: [ContainerCapability]
      }
  deriving (Read, Show, Eq)

makeLenses ''DockerConfig

defaultDockerConfig :: DockerConfig
defaultDockerConfig =
  DockerConfig
    Nothing
    [ CAP_MKNOD,
      CAP_SYS_ADMIN,
      CAP_SYS_CHROOT,
      CAP_SETGID,
      CAP_SETUID,
      CAP_NET_BIND_SERVICE,
      CAP_SETPCAP,
      CAP_SYS_PTRACE,
      CAP_SYS_MODULE
    ]

cfgFileSection :: String
cfgFileSection = "docker"

networkIdK :: String
networkIdK = "network"

dockerConfigToCPDocument ::
  DockerConfig -> CPDocument -> Either CPError CPDocument
dockerConfigToCPDocument c cp = do
  cp1 <- addSectionCP cp cfgFileSection
  cp2 <-
    setShowCP cp1 cfgFileSection networkIdK $
      _dockerNetworkId c
  containerCapsToCPDocument cp2 cfgFileSection $
    _dockerCapabilities c

parseDockerConfig :: CPDocument -> Either CPError DockerConfig
parseDockerConfig cp =
  let getr :: (CPGet a) => CPOptionSpec -> Either CPError a
      getr = readCP cp cfgFileSection
   in DockerConfig
        <$> getr networkIdK
        <*> parseContainerCapabilities cp cfgFileSection