{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveAnyClass #-}
module Cachix.Client.Config
  ( Config(..)
  , BinaryCacheConfig(..)
  , readConfig
  , writeConfig
  , mkConfig
  ) where

import Dhall     hiding ( Text )
import Dhall.Pretty     ( prettyExpr )
import GHC.Generics     ( Generic )
import System.Directory ( doesFileExist, createDirectoryIfMissing
                        , getXdgDirectory, XdgDirectory(..)
                        )
import System.Posix.Files ( setFileMode, unionFileModes, ownerReadMode
                          , ownerWriteMode )
import Protolude


data BinaryCacheConfig = BinaryCacheConfig
 { name :: Text
 , secretKey :: Text
 } deriving (Show, Generic, Interpret, Inject)

data Config = Config
 { authToken :: Text
 , binaryCaches :: [BinaryCacheConfig]
 } deriving (Show, Generic, Interpret, Inject)

mkConfig :: Text -> Config
mkConfig authtoken = Config
  { authToken = authtoken
  , binaryCaches = []
  }

readConfig :: IO (Maybe Config)
readConfig = do
  filename <- getFilename
  doesExist <- doesFileExist filename
  if doesExist
  then Just <$> input auto (toS filename)
  else return Nothing


getFilename :: IO FilePath
getFilename = do
  dir <- getXdgDirectory XdgConfig "cachix"
  createDirectoryIfMissing True dir
  return $ dir <> "/cachix.dhall"

writeConfig :: Config -> IO ()
writeConfig config = do
  filename <- getFilename
  let doc = prettyExpr $ embed inject config
  writeFile filename $ show doc
  assureFilePermissions filename
  putStrLn $ "Written to " <> filename

-- Does: chmod rw file
assureFilePermissions :: FilePath -> IO ()
assureFilePermissions fp =
  setFileMode fp $ unionFileModes ownerReadMode ownerWriteMode