-- This file is part of the Wire Server implementation.
--
-- Copyright (C) 2025 Wire Swiss GmbH <opensource@wire.com>
--
-- This program is free software: you can redistribute it and/or modify it under
-- the terms of the GNU Affero General Public License as published by the Free
-- Software Foundation, either version 3 of the License, or (at your option) any
-- later version.
--
-- This program is distributed in the hope that it will be useful, but WITHOUT
-- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
-- details.
--
-- You should have received a copy of the GNU Affero General Public License along
-- with this program. If not, see <https://www.gnu.org/licenses/>.

module API.Federator where

import Data.Function
import GHC.Stack
import qualified Network.HTTP.Client as HTTP
import Testlib.Prelude

getMetrics ::
  (HasCallStack, MakesValue domain) =>
  domain ->
  (ServiceMap -> HostPort) ->
  App Response
getMetrics :: forall domain.
(HasCallStack, MakesValue domain) =>
domain -> (ServiceMap -> HostPort) -> App Response
getMetrics domain
domain ServiceMap -> HostPort
service = do
  Request
req <- domain -> (ServiceMap -> HostPort) -> String -> App Request
forall domain.
(HasCallStack, MakesValue domain) =>
domain -> (ServiceMap -> HostPort) -> String -> App Request
rawBaseRequestF domain
domain ServiceMap -> HostPort
service String
"i/metrics"
  String -> Request -> App Response
submit String
"GET" Request
req

rawBaseRequestF :: (HasCallStack, MakesValue domain) => domain -> (ServiceMap -> HostPort) -> String -> App HTTP.Request
rawBaseRequestF :: forall domain.
(HasCallStack, MakesValue domain) =>
domain -> (ServiceMap -> HostPort) -> String -> App Request
rawBaseRequestF domain
domain ServiceMap -> HostPort
getService String
path = do
  String
domainV <- domain -> App String
forall a. (HasCallStack, MakesValue a) => a -> App String
objDomain domain
domain
  ServiceMap
serviceMap <- HasCallStack => String -> App ServiceMap
String -> App ServiceMap
getServiceMap String
domainV

  IO Request -> App Request
forall a. IO a -> App a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Request -> App Request)
-> (String -> IO Request) -> String -> App Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO Request
forall (m :: * -> *). MonadThrow m => String -> m Request
HTTP.parseRequest (String -> App Request) -> String -> App Request
forall a b. (a -> b) -> a -> b
$
    let HostPort String
h Word16
p = ServiceMap -> HostPort
getService ServiceMap
serviceMap
     in String
"http://" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
h String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
":" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Word16 -> String
forall a. Show a => a -> String
show Word16
p String -> String -> String
forall a. Semigroup a => a -> a -> a
<> (String
"/" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> [String] -> String
joinHttpPath (String -> [String]
splitHttpPath String
path))