{-# LANGUAGE OverloadedStrings #-}

module Text.Madlibs.Packaging.Fetch ( fetchGithub
                                    , fetchPackages
                                    , cleanPackages
                                    , installVimPlugin
                                    ) where

import Control.Monad (unless)
import qualified Codec.Archive.Tar      as Tar
import           Codec.Archive.Zip      (ZipOption (..),
                                         extractFilesFromArchive, toArchive)
import           Codec.Compression.GZip (decompress)
import           Network.HTTP.Client    hiding (decompress)
import           System.Directory       (removeFile, renameDirectory)
import           System.Environment     (getEnv)
import           System.Info            (os)
import Network.HTTP.Client.TLS (tlsManagerSettings)

invalid :: String -> Bool
invalid = not . ('/' `elem`)

-- | As an example, `vmchale/some-library` would be valid input.
fetchGithub :: String -> IO ()
fetchGithub s = unless (invalid s) $ do

    putStrLn $ "fetching library at " ++ s
    
    manager <- newManager tlsManagerSettings
    initialRequest <- parseRequest $ "https://github.com/" ++ s ++ "/archive/master.zip"
    response <- responseBody <$> httpLbs (initialRequest { method = "GET" }) manager

    putStrLn "unpacking libraries..."
    home <- getEnv "HOME"
    let packageDir = if os /= "mingw32" then home ++ "/.madlang" else home ++ "\\.madlang"
    let options = OptDestination packageDir
    extractFilesFromArchive [options] (toArchive response)

    let repoName = filter (/='/') . dropWhile (/='/') $ s
    renameDirectory (packageDir ++ "/" ++ repoName ++ "-master") (packageDir ++ "/" ++ repoName)

installVimPlugin :: IO ()
installVimPlugin = do

    putStrLn "fetching latest vim plugin..."
    manager <- newManager defaultManagerSettings
    initialRequest <- parseRequest "http://vmchale.com/static/vim.zip"
    response <- responseBody <$> httpLbs (initialRequest { method = "GET" }) manager

    putStrLn "installing locally..."
    home <- getEnv "HOME"
    let packageDir = if os /= "mingw32" then home ++ "/.vim" else home ++ "\\vimfiles"
    let options = OptDestination packageDir
    extractFilesFromArchive [options] (toArchive response)

    putStrLn "cleaning junk..."
    removeFile (packageDir ++ "/TODO.md")
    removeFile (packageDir ++ "/vim-screenshot.png")
    removeFile (packageDir ++ "/README.md")
    removeFile (packageDir ++ "/LICENSE")

-- TODO set remote package url flexibly
fetchPackages :: IO ()
fetchPackages = do

    putStrLn "fetching libraries..."
    manager <- newManager defaultManagerSettings
    initialRequest <- parseRequest "http://vmchale.com/static/packages.tar.gz"
    response <- responseBody <$> httpLbs (initialRequest { method = "GET" }) manager

    putStrLn "unpacking libraries..."
    home <- getEnv "HOME"
    let packageDir = if os /= "mingw32" then home ++ "/.madlang" else home ++ "\\.madlang"
    Tar.unpack packageDir . Tar.read . decompress $ response

cleanPackages :: IO ()
cleanPackages =
    putStrLn "done."