{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
module Check.Checker where

import qualified Data.Aeson as A
import qualified Data.ByteString.Lazy.Char8 as BS
import Control.Exception
import Check.Solution
import System.Exit

output = BS.putStrLn . A.encode . A.object
handleOk = output ["status" A..= ("ok" :: String), "result" A..= ("__check_0__" :: String)]
handleSuccess res = output ["status" A..= ("success" :: String), "result" A..= res]
handleFailure res args = output ["status" A..= ("failure" :: String), "result" A..= res, "arguments" A..= args]
handleRuntimeError e = output ["status" A..= ("error" :: String), "result" A..= show e]

test :: IO ()
test = do
    let expected1 = 2
    let res1 = expected1 == solution 1 1

    (if res1
        then handleSuccess res1
        else handleFailure res1 ("[1, 1]" :: String))
        `catch` \(e ::ErrorCall) -> handleRuntimeError e

    let expected2 = 8
    let res2 = expected2 == solution 5 3

    (if res2
        then handleSuccess res2
        else handleFailure res2 ("[5, 3]" :: String))
        `catch` \(e ::ErrorCall) -> handleRuntimeError e

    let final_res = [res1, res2]

    (if and final_res
        then handleOk
        else output [])
        `catch` \(e ::ErrorCall) -> handleRuntimeError e
