module Unused.CLI.Views.SearchResult
    ( ResultsFormat(..)
    , searchResults
    ) where

import           Control.Arrow ((&&&))
import qualified Data.Map.Strict as Map
import           Unused.CLI.Util
import qualified Unused.CLI.Views.NoResultsFound as V
import           Unused.CLI.Views.SearchResult.ColumnFormatter
import qualified Unused.CLI.Views.SearchResult.ListResult as V
import qualified Unused.CLI.Views.SearchResult.TableResult as V
import           Unused.CLI.Views.SearchResult.Types
import           Unused.Grouping (Grouping(..), GroupedTerms)
import           Unused.Types (TermMatchSet, TermResults(..), TermMatch)

searchResults :: ResultsFormat -> [GroupedTerms] -> IO ()
searchResults format terms = do
    resetScreen
    runReaderT (printFormattedTerms terms) resultsOptions
  where
    columnFormatter = buildColumnFormatter $ termsToResults terms
    resultsOptions = ResultsOptions columnFormatter format
    termsToResults = concatMap (Map.elems . snd)

printFormattedTerms :: [GroupedTerms] -> ResultsPrinter ()
printFormattedTerms [] = liftIO V.noResultsFound
printFormattedTerms ts = mapM_ printGroupingSection ts

listFromMatchSet :: TermMatchSet -> [(String, TermResults)]
listFromMatchSet =
  Map.toList

printGroupingSection :: GroupedTerms -> ResultsPrinter ()
printGroupingSection (g, tms) = do
    liftIO $ printGrouping g
    mapM_ printTermResults $ listFromMatchSet tms

printGrouping :: Grouping -> IO ()
printGrouping NoGrouping = return ()
printGrouping g = do
    putStr "\n"
    setSGR [SetColor Foreground Vivid Black]
    setSGR [SetConsoleIntensity BoldIntensity]
    print g
    setSGR [Reset]

printTermResults :: (String, TermResults) -> ResultsPrinter ()
printTermResults =
    uncurry printMatches . (id &&& trMatches) . snd

printMatches :: TermResults -> [TermMatch] -> ResultsPrinter ()
printMatches r ms = do
    outputFormat' <- outputFormat
    case outputFormat' of
        Column -> V.printTable r ms
        List -> V.printList r ms