module Autoexporter where

import qualified Data.List as List
import qualified System.Directory as Directory
import qualified System.Environment as Environment
import qualified System.FilePath as FilePath

main :: IO ()
main = do
    args <- Environment.getArgs
    case args of
        [name, inputFile, outputFile] -> do
            let moduleName = makeModuleName name

            let directory = FilePath.dropExtension inputFile
            files <- Directory.getDirectoryContents directory
            let haskellFiles = filter (\ f -> List.isSuffixOf ".hs" f || List.isSuffixOf ".lhs" f) files
            let paths = map (directory FilePath.</>) haskellFiles
            let modules = List.sort (map makeModuleName paths)
            let exports = init (unlines (map (\ x -> "    module " ++ x ++ ",") modules))
            let imports = init (unlines (map ("import " ++) modules))

            let output = unlines
                    [ unwords ["module", moduleName, "("]
                    , exports
                    , ") where"
                    , ""
                    , imports
                    ]
            writeFile outputFile output
        _ -> error ("unexpected arguments: " ++ show args)
  where
    makeModuleName :: FilePath -> String
    makeModuleName name =
        let path = FilePath.dropExtension name
            parts = FilePath.splitDirectories path
            -- TODO: Figure out a better way to get the actual module name.
            rest = tail (dropWhile (/= "library") parts)
        in  List.intercalate "." rest