{-# LANGUAGE GADTs             #-}
{-# LANGUAGE OverloadedLists   #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}

import           Arithmetic
import           Network.GRPC.HighLevel.Generated

clientConfig :: ClientConfig
clientConfig = ClientConfig { clientServerHost = "localhost"
                            , clientServerPort = 50051
                            , clientArgs = []
                            , clientSSLConfig = Nothing
                            , clientAuthority = Nothing
                            }

main :: IO ()
main = withGRPCClient clientConfig $ \client -> do
  Arithmetic{..} <- arithmeticClient client

  -- Request for the Add RPC
  ClientNormalResponse (OneInt x) _meta1 _meta2 _status _details
    <- arithmeticAdd (ClientNormalRequest (TwoInts 2 2) 1 [])
  putStrLn ("2 + 2 = " ++ show x)

  -- Request for the RunningSum RPC
  ClientWriterResponse reply _streamMeta1 _streamMeta2 streamStatus streamDtls
    <- arithmeticRunningSum $ ClientWriterRequest 1 [] $ \send -> do
        eithers <- mapM send [OneInt 1, OneInt 2, OneInt 3]
                     :: IO [Either GRPCIOError ()]
        case sequence eithers of
          Left err -> error ("Error while streaming: " ++ show err)
          Right _  -> return ()

  case reply of
    Just (OneInt y) -> print ("1 + 2 + 3 = " ++ show y)
    Nothing -> putStrLn ("Client stream failed with status "
                         ++ show streamStatus
                         ++ " and details "
                         ++ show streamDtls)
  return ()