module DzenDhall.Commands.Unplug where

import           DzenDhall.App
import           DzenDhall.Extra
import           DzenDhall.Arguments
import qualified DzenDhall.Commands.Plug as Plug

import           Control.Applicative
import           Control.Monad
import           Data.Text (Text)
import           Prelude
import           System.Directory (removeFile)
import qualified Data.Text as T
import qualified Text.Parsec as P


unplugCommand :: UnplugCommand -> App Common ()
unplugCommand (UnplugCommand argument) = do

  let parseResult =
        T.pack <$> P.runParser Plug.saneIdentifier () "Plugin name" argument

  withEither parseResult
    invalidPluginName
    \pluginName -> do

      Plug.checkIfPluginFileExists pluginName

      echo =<< highlight "Are you sure you want to remove this plugin? (Y/n)"

      response <- liftIO getLine

      unless (isYes response) do
        exit 1 "Aborting."

      deletePluginFile pluginName

      echo =<< highlight
        "Success! You should delete all references of this plugin from your config file."


invalidPluginName :: P.ParseError -> App Common ()
invalidPluginName err =
  exit 1 $ fromLines
  [ "Invalid plugin name"
  , ""
  , showPack err
  ]


deletePluginFile :: Text -> App Common ()
deletePluginFile pluginName = do
  pluginFile <- snd <$> Plug.getPluginPaths pluginName
  liftIO $ removeFile pluginFile