{-# LANGUAGE OverloadedStrings #-}
module Database.Migrate.Migration.FileInferred (
  migration
, up
, down
, directory
) where

import           Data.List (isSuffixOf, intercalate, groupBy)
import           Data.Text (Text, pack)

import           Database.Migrate.Migration
import qualified Database.Migrate.Migration.File         as File
import qualified Database.Migrate.Migration.FileStandard as FileStandard
import           System.FilePath
import           System.Directory

directory :: FilePath -> IO (Either Text [Migration])
directory path = do
  changes <- (filter (\p -> isSuffixOf ".up.sql" p || isSuffixOf ".down.sql" p)) `fmap` getDirectoryContents path
  return $ mapM (\group ->
    case group of
      a : _ : [] -> (Right $ migration (dropExtension . dropExtension $ a))
      a : [] -> (Right $ (if ((takeExtension . takeExtension $ a) == "up") then File.up else File.down) (infer a) a)
      _ -> (Left . pack $ "Duplicate prefix detected in: " ++ (intercalate "," group))
    ) $ groupBy (\a b -> (dropExtension . dropExtension $ a) == (dropExtension . dropExtension $ b)) changes

migration :: FilePath -> Migration
migration prefix =
  FileStandard.migration (infer prefix) prefix

up :: FilePath -> Migration
up prefix =
  FileStandard.up (infer prefix) prefix

down :: FilePath -> Migration
down prefix =
  FileStandard.down (infer prefix) prefix

infer :: FilePath -> MigrationId
infer =
  pack . dropExtensions . last . splitPath