module Database.Migrate.Main (defaultMain) where

import qualified Paths_database_migrate as Program (version)

import qualified Data.Text as T
import Data.Version (showVersion)

import Database.PostgreSQL.Simple

import System.Console.CmdArgs.Explicit
import System.Directory
import System.Exit

usage = [
    "usage: migrate [-v|--verbose] [-r|--dry-run] [-t|--test-run] [-a|--auto] [-s|--scripts DIR]"
  , "               [-h|--host HOSTNAME] [-p|--port PORTNUMBER] [-u|--user USER]"
  , "               [-P|--password PASSWORD] [-d|--db DATABASE] [-g|--postgres] [-m|--mysql] [VERSION]"
  , "       migrate -h|--help"
  , "       migrate -V|--version"
  ]

data Arguments = Arguments {
    printhelp :: Bool
  , printversion :: Bool
  , dry :: Bool
  , test :: Bool
  , auto :: Bool
  , postgres :: Bool
  , mysql :: Bool
  , version :: Maybe String
  , scripts :: String
  } deriving (Eq, Show)

defaultArguments cwd = Arguments {
    printhelp = False
  , printversion = False
  , dry = False
  , test = False
  , auto = False
  , postgres = False
  , mysql = False
  , version = Nothing
  , scripts = cwd
  }

migratemode cwd =
  mode "migrate" (defaultArguments cwd) "" (flagArg (\v a -> Right $ a { version = Just v }) "VERSION") [
      flagNone [ "h", "help" ]     (\a -> a { printhelp = True })    ""
    , flagNone [ "V", "version" ]  (\a -> a { printversion = True }) ""
    , flagNone [ "r", "dry-run" ]  (\a -> a { dry = True })          ""
    , flagNone [ "g", "postgres" ]  (\a -> a { postgres = True })    ""
    , flagNone [ "m", "mysql" ]  (\a -> a { postgres = True })    ""
    ]

defaultMain =
  getCurrentDirectory >>= \cwd -> processArgs (migratemode cwd) >>= run

run args
  | printhelp args      = mapM_ putStrLn usage
  | printversion args   = putStrLn $ "migrate " ++ showVersion Program.version
  | otherwise           = migrate args

bomb msg =
  putStrLn msg >> exitFailure

migrate args =
  case (postgres args, mysql args) of
    (False, False) -> bomb "Must specify exactly one of -p or -m for database selection, specified none."
    (True, True) -> bomb "Must specify exactly one of -p or -m for database selection, specified two."
    (True, _) -> runpostgres args
    (_, True) -> runmysql args

runmysql _  =
  bomb "Not implemented yet."

runpostgres args =
  undefined