-- | <http://strava.github.io/api/v3/segments/>
module Strive.Actions.Segments
  ( getSegment
  , getStarredSegments
  , getSegmentEfforts
  , getSegmentLeaderboard
  , exploreSegments
  ) where

import Data.List (intercalate)
import Network.HTTP.Types (Query, toQuery)
import Strive.Aliases (Latitude, Longitude, Result, SegmentId)
import Strive.Client (Client)
import Strive.Internal.HTTP (get)
import Strive.Options
  ( ExploreSegmentsOptions
  , GetSegmentEffortsOptions
  , GetSegmentLeaderboardOptions
  , GetStarredSegmentsOptions
  )
import Strive.Types
  ( EffortDetailed
  , SegmentDetailed
  , SegmentExplorerResponse
  , SegmentLeaderboardResponse
  , SegmentSummary
  )

-- | <http://strava.github.io/api/v3/segments/#retrieve>
getSegment :: Client -> SegmentId -> IO (Result SegmentDetailed)
getSegment :: Client -> SegmentId -> IO (Result SegmentDetailed)
getSegment Client
client SegmentId
segmentId = Client -> String -> Query -> IO (Result SegmentDetailed)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> String -> q -> IO (Result j)
get Client
client String
resource Query
query
 where
  resource :: String
resource = String
"api/v3/segments/" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> SegmentId -> String
forall a. Show a => a -> String
show SegmentId
segmentId
  query :: Query
query = [] :: Query

-- | <http://strava.github.io/api/v3/segments/#starred>
getStarredSegments
  :: Client -> GetStarredSegmentsOptions -> IO (Result [SegmentSummary])
getStarredSegments :: Client -> GetStarredSegmentsOptions -> IO (Result [SegmentSummary])
getStarredSegments Client
client GetStarredSegmentsOptions
options = Client -> String -> Query -> IO (Result [SegmentSummary])
forall q j.
(QueryLike q, FromJSON j) =>
Client -> String -> q -> IO (Result j)
get Client
client String
resource Query
query
 where
  resource :: String
resource = String
"api/v3/segments/starred"
  query :: Query
query = GetStarredSegmentsOptions -> Query
forall a. QueryLike a => a -> Query
toQuery GetStarredSegmentsOptions
options

-- | <http://strava.github.io/api/v3/segments/#efforts>
getSegmentEfforts
  :: Client
  -> SegmentId
  -> GetSegmentEffortsOptions
  -> IO (Result [EffortDetailed])
getSegmentEfforts :: Client
-> SegmentId
-> GetSegmentEffortsOptions
-> IO (Result [EffortDetailed])
getSegmentEfforts Client
client SegmentId
segmentId GetSegmentEffortsOptions
options = Client -> String -> Query -> IO (Result [EffortDetailed])
forall q j.
(QueryLike q, FromJSON j) =>
Client -> String -> q -> IO (Result j)
get Client
client String
resource Query
query
 where
  resource :: String
resource = String
"api/v3/segments/" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> SegmentId -> String
forall a. Show a => a -> String
show SegmentId
segmentId String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/all_efforts"
  query :: Query
query = GetSegmentEffortsOptions -> Query
forall a. QueryLike a => a -> Query
toQuery GetSegmentEffortsOptions
options

-- | <http://strava.github.io/api/v3/segments/#leaderboard>
getSegmentLeaderboard
  :: Client
  -> SegmentId
  -> GetSegmentLeaderboardOptions
  -> IO (Result SegmentLeaderboardResponse)
getSegmentLeaderboard :: Client
-> SegmentId
-> GetSegmentLeaderboardOptions
-> IO (Result SegmentLeaderboardResponse)
getSegmentLeaderboard Client
client SegmentId
segmentId GetSegmentLeaderboardOptions
options = Client -> String -> Query -> IO (Result SegmentLeaderboardResponse)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> String -> q -> IO (Result j)
get Client
client String
resource Query
query
 where
  resource :: String
resource = String
"api/v3/segments/" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> SegmentId -> String
forall a. Show a => a -> String
show SegmentId
segmentId String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"/leaderboard"
  query :: Query
query = GetSegmentLeaderboardOptions -> Query
forall a. QueryLike a => a -> Query
toQuery GetSegmentLeaderboardOptions
options

-- | <http://strava.github.io/api/v3/segments/#explore>
exploreSegments
  :: Client
  -> (Latitude, Longitude, Latitude, Longitude)
  -> ExploreSegmentsOptions
  -> IO (Result SegmentExplorerResponse)
exploreSegments :: Client
-> (Latitude, Latitude, Latitude, Latitude)
-> ExploreSegmentsOptions
-> IO (Result SegmentExplorerResponse)
exploreSegments Client
client (Latitude
south, Latitude
west, Latitude
north, Latitude
east) ExploreSegmentsOptions
options = Client -> String -> Query -> IO (Result SegmentExplorerResponse)
forall q j.
(QueryLike q, FromJSON j) =>
Client -> String -> q -> IO (Result j)
get
  Client
client
  String
resource
  Query
query
 where
  resource :: String
resource = String
"api/v3/segments/explore"
  query :: Query
query =
    [(String, String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
        [(String
"bounds", String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"," ((Latitude -> String) -> [Latitude] -> [String]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Latitude -> String
forall a. Show a => a -> String
show [Latitude
south, Latitude
west, Latitude
north, Latitude
east]))]
      Query -> Query -> Query
forall a. Semigroup a => a -> a -> a
<> ExploreSegmentsOptions -> Query
forall a. QueryLike a => a -> Query
toQuery ExploreSegmentsOptions
options