{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}

module Yesod.EmbeddedStatic.Remote
  ( embedRemoteFileAt
  , ensureFile
  ) where

import Control.Monad
import qualified Data.ByteString.Lazy as LB
import Language.Haskell.TH
import Network.HTTP.Client
import Network.HTTP.Client.TLS
import System.Directory
import System.FilePath
import Yesod.EmbeddedStatic
import Yesod.EmbeddedStatic.Types

-- | Embed a file after downloading it (once, and caching it locally)
embedRemoteFileAt ::
     FilePath -- ^ The path to put it (relative)
  -> String -- ^ The url to download it from
  -> Generator
embedRemoteFileAt fp url = do
  runIO $ ensureFile fp url
  embedFile fp

ensureFile :: FilePath -> String -> IO ()
ensureFile rp url = do
  createDirectoryIfMissing True $ takeDirectory rp
  exists <- doesFileExist rp
  unless exists $ do
    man <- newManager tlsManagerSettings
    putStrLn $ unwords ["Downloading", url, "to put it at", rp]
    req <- parseUrlThrow url
    resp <- httpLbs req man
    LB.writeFile rp $ responseBody resp