{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators     #-}

module Marconi.Api.Routes where

import Data.Text (Text)
import Marconi.Api.Types (UtxoTxOutReport)
import Marconi.JsonRpc.Types (JsonRpc, JsonRpcNotification, RawJsonRpc)
import Servant.API (Get, JSON, NoContent, PlainText, Post, ReqBody, (:<|>), (:>))
type Echo                   = JsonRpc "echo" String String String
type TxOutRefReport         = JsonRpc "utxoTxOutReport" String String UtxoTxOutReport
type TxOutRefsReport        = JsonRpc "utxoTxOutReports" Int String [UtxoTxOutReport]
type TargetAddressesReport  = JsonRpc "addressesBech32Report" Int String [Text]

type Print    = JsonRpcNotification "print" String

type RpcAPI
    = Echo
    :<|> TxOutRefReport
    :<|> TxOutRefsReport
    :<|> TargetAddressesReport
    :<|> Print

type JsonRpcAPI = "json-rpc" :> RawJsonRpc RpcAPI

type GetTime = "time" :> Get '[PlainText] String

type GetTargetAddresses = "addresses" :> Get '[JSON] [Text]

type PrintMessage = "print" :> ReqBody '[PlainText] String :> Post '[PlainText] NoContent

type RestAPI
    = "rest"
    :> (GetTime
        :<|> GetTargetAddresses
        :<|> PrintMessage)

type API = JsonRpcAPI :<|> RestAPI

type NonEndpoint = "json-rpc" :> RawJsonRpc (JsonRpc "launch-missles" Int String Bool)