import Database.PostgreSQL.Migrate
import System.Environment
import System.Exit
import System.FilePath
import System.IO

main :: IO ()
main = do
  args <- getArgs
  ec <- case args of
    "init":[] -> initializeDb >> return ExitSuccess
    "dump":[] -> withFile (defaultMigrationsDir </> ".." </> "schema.sql")
                  WriteMode $ dumpDb
    "dump":file:[] -> withFile file WriteMode $ dumpDb
    "migrate":[] -> runMigrationsForDir stdout defaultMigrationsDir
    "migrate":dir:[] -> runMigrationsForDir stdout dir
    "rollback":[] -> runRollbackForDir defaultMigrationsDir
    "rollback":dir:[] -> runRollbackForDir dir
    "new":name:[] -> newMigration name defaultMigrationsDir >>
                      return ExitSuccess
    "new":name:dir:[] -> newMigration name dir >> return ExitSuccess
    "compile":out:[] -> compileMigrationsForDir defaultMigrationsDir out
    "compile":out:dir:[] -> compileMigrationsForDir dir out
    _ -> do
      progName <- getProgName
      putStrLn $ "Usage: " ++ progName ++ " migrate|rollback [DIRECTORY]"
      putStrLn $ "       " ++ progName ++ " compile [PROGRAM] [DIRECTORY]"
      putStrLn $ "       " ++ progName ++ " init"
      putStrLn $ "       " ++ progName ++ " dump [FILE]"
      putStrLn $ "       " ++ progName ++ " new NAME [DIRECTORY]"
      return $ ExitFailure 1
  if ec == ExitSuccess then
    return ()
    else exitWith ec