{-# 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 <- httpLbs (initialRequest { method = "GET" }) manager
    let byteStringResponse = responseBody response

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

    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 <- httpLbs (initialRequest { method = "GET" }) manager
    let byteStringResponse = responseBody response

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

    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 <- httpLbs (initialRequest { method = "GET" }) manager
    let byteStringResponse = responseBody response

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

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