module Require where

import qualified Data.Text as Text
import Options.Generic
import Relude
import System.Directory
import qualified Require.Error as Error
import qualified Require.File as File
import Require.Transform
import Require.Types


data CommandArguments
  = CommandArguments Text Text Text
  deriving (Generic)

instance ParseRecord CommandArguments

findRequires :: IO (Maybe File.Name)
findRequires = do
  currentDir <- getCurrentDirectory
  files <- getDirectoryContents currentDir
  let textFiles = fmap toText files
  return $ File.Name . head <$> nonEmpty (filter (Text.isSuffixOf "Requires") textFiles)

requireMain :: IO ()
requireMain = do
  CommandArguments inputFile _ outputFile <- getRecord "Require Haskell preprocessor" :: IO CommandArguments
  requiresFile <- findRequires
  run (AutorequireOnDirective requiresFile) (File.Name inputFile) (File.Name outputFile)

autorequireMain :: IO ()
autorequireMain = do
  CommandArguments inputFile _ outputFile <- getRecord "Require Haskell preprocessor" :: IO CommandArguments
  requiresFile <- findRequires
  case requiresFile of
    Nothing -> Error.die (File.Name inputFile) Error.MissingRequiresFile
    Just fn -> run (AutorequireEnabled fn) (File.Name inputFile) (File.Name outputFile)

run :: AutorequireMode File.Name -> File.Name -> File.Name -> IO ()
run autoMode inputFile outputFile = do
  input <- File.read inputFile
  autoInput <- traverse File.read autoMode
  case transform autoInput input of
    Left err -> Error.die inputFile err
    Right ls -> File.writeLines outputFile ls