{-|
High-level client functions perfoming requests to OpenWeatherMap API.
-}
module Web.OpenWeatherMap.Client
  ( getWeather
  , getForecast
  ) where

import Network.HTTP.Client.TLS (newTlsManager)
import Servant.Client
  ( BaseUrl(BaseUrl)
  , ClientEnv
  , ClientError
  , Scheme(Https)
  , mkClientEnv
  , runClientM
  )

import qualified Web.OpenWeatherMap.API as API
import Web.OpenWeatherMap.Types.CurrentWeather (CurrentWeather)
import Web.OpenWeatherMap.Types.ForecastWeather (ForecastWeather)
import Web.OpenWeatherMap.Types.Location (Location)

-- | Make a request to OpenWeatherMap API
--   and return current weather in given location.
getWeather ::
     String -- ^ API key.
  -> Location
  -> IO (Either ClientError CurrentWeather)
getWeather :: String -> Location -> IO (Either ClientError CurrentWeather)
getWeather String
appid Location
loc = IO ClientEnv
defaultEnv forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM (String -> Location -> ClientM CurrentWeather
API.currentWeather String
appid Location
loc)

-- | Make a request to OpenWeatherMap API
--   and return forecast weather in given location.
getForecast ::
     String -- ^ API key.
  -> Location
  -> IO (Either ClientError ForecastWeather)
getForecast :: String -> Location -> IO (Either ClientError ForecastWeather)
getForecast String
appid Location
loc =
  IO ClientEnv
defaultEnv forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. ClientM a -> ClientEnv -> IO (Either ClientError a)
runClientM (String -> Location -> ClientM ForecastWeather
API.forecastWeather String
appid Location
loc)

defaultEnv :: IO ClientEnv
defaultEnv :: IO ClientEnv
defaultEnv = do
  Manager
manager <- forall (m :: * -> *). MonadIO m => m Manager
newTlsManager
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Manager -> BaseUrl -> ClientEnv
mkClientEnv Manager
manager BaseUrl
baseUrl

baseUrl :: BaseUrl
baseUrl :: BaseUrl
baseUrl = Scheme -> String -> Int -> String -> BaseUrl
BaseUrl Scheme
Https String
"api.openweathermap.org" Int
443 String
"/data/2.5"