{-# LANGUAGE OverloadedStrings #-}

module Unused.TermSearch.Internal
    ( commandLineOptions
    , parseSearchResult
    ) where

import qualified Data.Char as C
import qualified Data.Maybe as M
import qualified Data.Text as T
import           Unused.Types (SearchTerm(..), TermMatch(..))
import           Unused.Util (stringToInt)

commandLineOptions :: String -> [String]
commandLineOptions t =
    if regexSafeTerm t
        then ["(\\W|^)" ++ t ++ "(\\W|$)", "."] ++ baseFlags
        else [t, ".", "-Q"] ++ baseFlags
  where
    baseFlags = ["-c", "--ackmate", "--ignore-dir", "tmp/unused"]

parseSearchResult :: SearchTerm -> String -> Maybe TermMatch
parseSearchResult term =
    maybeTermMatch . map T.unpack . T.splitOn ":" . T.pack
  where
    maybeTermMatch [_, path, count] = Just $ toTermMatch term path $ countInt count
    maybeTermMatch _ = Nothing
    countInt = M.fromMaybe 0 . stringToInt
    toTermMatch (OriginalTerm t) path = TermMatch t path Nothing
    toTermMatch (AliasTerm t a) path = TermMatch t path (Just a)

regexSafeTerm :: String -> Bool
regexSafeTerm = all (\c -> C.isAlphaNum c || c == '_' || c == '-')