import Data.List
import System.Directory
import System.Environment
import System.FilePath.Glob
import System.FilePath.Posix

usage :: IO ()
usage = do progName <- getProgName
           putStrLn ("Usage:\n\t" ++ progName ++ " \"srcPattern\" \"dstPattern\"")

hasWildcard :: [Char] -> Bool
hasWildcard name = 1 == (length $ filter (\x -> x == '*') name)

bruteIndex e l = case (elemIndex e l) of
                   Just x -> x
                   Nothing -> 0

trimHeadTail s pre pos = let
  nohead = drop (length pre) s in
    reverse (drop (length pos) (reverse nohead))


partRename preL posL preR posR name = 
  let fn = takeFileName name in
  renameFile fn (preR ++ (trimHeadTail fn preL posL) ++ posR)

batchRename :: [Char] -> [Char] -> IO ()
batchRename left right = if hasWildcard left && hasWildcard right then
                           let wildcardLeftIndex = bruteIndex '*' left
                               oldPreLeft = take wildcardLeftIndex left 
                               oldPosLeft = drop (wildcardLeftIndex + 1) left
                               wildcardRightIndex = bruteIndex '*' right
                               oldPreRight = take wildcardRightIndex right
                               oldPosRight = drop (wildcardRightIndex + 1) right in
                             do files <- glob left
                                sequence_ (map (partRename oldPreLeft oldPosLeft
                                                          oldPreRight oldPosRight)
                                               files)
                         else
                           putStrLn "Oops, use simple rename please."
main :: IO ()
main = do args <- System.Environment.getArgs
          case args of
            [l,r] -> batchRename l r
            otherwise -> usage