{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE GADTs             #-}
{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE OverloadedLists   #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE TypeOperators     #-}

import           Data.ByteString                  (ByteString)
import           Data.Maybe                       (fromMaybe)
import           GHC.Generics                     (Generic)
import           Network.GRPC.HighLevel.Generated (GRPCMethodType (..),
                                                   Host (..), Port (..),
                                                   ServerRequest (..),
                                                   ServerResponse (..),
                                                   StatusCode (..),
                                                   defaultServiceOptions,
                                                   serverHost, serverPort)
import           Options.Generic

import           Echo

data Args = Args
  { bind :: Maybe ByteString <?> "grpc endpoint hostname (default \"localhost\")"
  , port :: Maybe Int        <?> "grpc endpoint port (default 50051)"
  } deriving (Generic, Show)
instance ParseRecord Args

doEcho :: ServerRequest 'Normal EchoRequest EchoResponse
       -> IO (ServerResponse 'Normal EchoResponse)
doEcho (ServerNormalRequest _meta (EchoRequest pay)) = do
  return (ServerNormalResponse (EchoResponse pay) mempty StatusOk "")

main :: IO ()
main = do
  Args{..} <- getRecord "Runs the echo service"
  let opts = defaultServiceOptions
             { serverHost = Host . fromMaybe "localhost" . unHelpful $ bind
             , serverPort = Port . fromMaybe 50051       . unHelpful $ port
             }
  echoServer Echo{ echoDoEcho = doEcho } opts