{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

module Brok.IO.Output
    ( output
    ) where

import ClassyPrelude

import Brok.IO.CLI
import Brok.Types.Link
import Brok.Types.Result

-- output
linkOutput :: Link -> IO ()
linkOutput (Link url BareLink)          = splitErr "- Failed (unknown)" url
linkOutput (Link url Ignored)           = mehssage $ "- Ignored: " ++ url
linkOutput (Link url Cached)            = splitOut "- OK (cached)" url
linkOutput (Link url (Working code))    = splitOut ("- OK (" ++ tshow code ++ ")") url
linkOutput (Link url (Broken code))     = splitErr ("- Failed (" ++ tshow code ++ ")") url
linkOutput (Link url ConnectionFailure) = splitErr "- Could not connect" url
linkOutput (Link url InvalidURL)        = splitErr "- Invalid URL" url

statusError :: Link -> Bool
statusError (Link _ (Working _)) = False
statusError (Link _ Cached)      = False
statusError (Link _ Ignored)     = False
statusError _                    = True

countErrors :: [Link] -> Int
countErrors statuses = length $ filter statusError statuses

outputPath :: TFilePath -> Text
outputPath path = concat ["\n", "[", path, "]"]

output :: Result -> IO Bool
output (Result path NotFound) = do
    errorMessage $ outputPath path
    errorMessage "  - File not found"
    return True
output (Result path (ParseError err)) = do
    errorMessage $ outputPath path
    errorMessage "  - Parse error:"
    errorMessage err
    return True
output (Result path (Links links)) = do
    let errs = countErrors links /= 0
    if errs
        then errorMessage $ outputPath path
        else message $ outputPath path
    if not (null links)
        then sequence_ $ linkOutput <$> links
        else putStrLn "- No links found in file"
    return errs
output _ = return False