module Unused.CLI.Views.SearchResult.ListResult
    ( printList
    ) where

import Control.Monad (forM_, void, when)
import Data.List (intercalate, (\\))
import Unused.CLI.Util
import Unused.Types
import Unused.CLI.Views.SearchResult.Internal
import Unused.CLI.Views.SearchResult.Types

printList :: TermResults -> [TermMatch] -> ResultsPrinter ()
printList r ms = liftIO $
    forM_ ms $ \m -> do
        printTermAndOccurrences r
        printAliases r
        printFilePath m
        printSHAs r
        printRemovalReason r
        putStr "\n"

printTermAndOccurrences :: TermResults -> IO ()
printTermAndOccurrences r = do
    setSGR [SetColor Foreground Dull (termColor r)]
    setSGR [SetConsoleIntensity BoldIntensity]
    putStr "  "
    setSGR [SetUnderlining SingleUnderline]
    putStr $ trTerm r
    setSGR [Reset]

    setSGR [SetColor Foreground Vivid Cyan]
    setSGR [SetConsoleIntensity NormalIntensity]
    putStr " ("
    putStr $ pluralize (totalFileCount r) "file" "files"
    putStr ", "
    putStr $ pluralize (totalOccurrenceCount r) "occurrence" "occurrences"
    putStr ")"
    setSGR [Reset]
    putStr "\n"

printAliases :: TermResults -> IO ()
printAliases r = when anyAliases $ do
    printHeader "    Aliases: "
    putStrLn $ intercalate ", " remainingAliases
  where
    anyAliases = not $ null remainingAliases
    remainingAliases = trTerms r \\ [trTerm r]

printFilePath :: TermMatch -> IO ()
printFilePath m = do
    printHeader "    File Path: "
    setSGR [SetColor Foreground Dull Cyan]
    putStrLn $ tmPath m
    setSGR [Reset]

printSHAs :: TermResults -> IO ()
printSHAs r =
    case mshas of
        Nothing -> void $ putStr ""
        Just shas' -> do
            printHeader "    Recent SHAs: "
            putStrLn $ intercalate ", " shas'
  where
    mshas = (map gcSha . gcCommits) <$> trGitContext r

printRemovalReason :: TermResults -> IO ()
printRemovalReason r = do
    printHeader "    Reason: "
    putStrLn $ removalReason r

printHeader :: String -> IO ()
printHeader v = do
    setSGR [SetConsoleIntensity BoldIntensity]
    putStr v
    setSGR [SetConsoleIntensity NormalIntensity]

pluralize :: Int -> String -> String -> String
pluralize i@1 singular _ = show i ++ " " ++ singular
pluralize i _ plural = show i ++ " " ++ plural