module Unused.Cache.FindArgsFromIgnoredPaths
    ( findArgs
    ) where

import qualified Data.Char as C
import qualified Data.List as L
import qualified System.FilePath as FP

findArgs :: [String] -> [String]
findArgs = concatMap ignoreToFindArgs . validIgnoreOptions

wildcardPrefix :: String -> String
wildcardPrefix a@('*':'/':_) = a
wildcardPrefix ('*':s) = "*/" ++ s
wildcardPrefix ('/':s) = "*/" ++ s
wildcardPrefix a = "*/" ++ a

toExclusions :: String -> [String]
toExclusions s =
    case (isWildcardFilename s, isMissingFilename s) of
        (True, _) -> ["-not", "-path", s]
        (_, True) -> ["-not", "-path", wildcardSuffix s]
        (_, False) -> ["-not", "-name", s, "-not", "-path", wildcardSuffix s]

ignoreToFindArgs :: String -> [String]
ignoreToFindArgs = toExclusions . wildcardPrefix

wildcardSuffix :: String -> String
wildcardSuffix s
    | isWildcardFilename s = s
    | "/" `L.isSuffixOf` s = s ++ "*"
    | otherwise = s ++ "/*"

isWildcardFilename :: String -> Bool
isWildcardFilename = elem '*' . FP.takeFileName

isMissingFilename :: String -> Bool
isMissingFilename = null . FP.takeFileName

validIgnoreOptions :: [String] -> [String]
validIgnoreOptions = filter isPath
  where
    isPath "" = False
    isPath ('/':_) = True
    isPath ('.':_) = True
    isPath s = C.isAlphaNum $ head s