{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections       #-}

module Antiope.Shell.S3
  ( putFile
  ) where

import Antiope.S3.Types      (S3Uri)
import Control.Monad.Except
import Data.Monoid           ((<>))
import Data.Text             as T (Text, pack, unpack)
import Network.AWS.Data.Text (toText)

import qualified System.Exit    as IO
import qualified System.Process as IO

-- | Puts file into a specified S3 bucket
putFile :: MonadIO m
  => S3Uri        -- ^ File name on S3
  -> FilePath         -- ^ Source file path
  -> ExceptT Text m ()   -- ^ Etag when the operation is successful
putFile s3Uri filePath = do
  exitCode <- liftIO $ IO.rawSystem "aws" ["s3", "cp", "--quiet", filePath, T.unpack (toText s3Uri)]
  case exitCode of
    IO.ExitSuccess   -> return ()
    IO.ExitFailure n -> throwError $ "Command failed with exit code: " <> T.pack (show n)