-- | <http://strava.github.io/api/v3/activities/>
module Strive.Actions.Activities
  ( createActivity
  , getActivity
  , updateActivity
  , deleteActivity
  , getCurrentActivities
  , getRelatedActivities
  , getFeed
  , getActivityZones
  , getActivityLaps
  ) where

import Data.Aeson (encode)
import Data.ByteString.Char8 (unpack)
import Data.ByteString.Lazy (toStrict)
import Network.HTTP.Client (responseBody, responseStatus)
import Network.HTTP.Types (Query, methodDelete, noContent204, toQuery)
import Strive.Aliases (ActivityId, ElapsedTime, Name, Result, StartTime)
import Strive.Client (Client)
import Strive.Enums (ActivityType)
import Strive.Internal.HTTP (buildRequest, get, performRequest, post, put)
import Strive.Options
  ( CreateActivityOptions
  , GetActivityOptions
  , GetCurrentActivitiesOptions
  , GetFeedOptions
  , GetRelatedActivitiesOptions
  , UpdateActivityOptions
  )
import Strive.Types
  (ActivityDetailed, ActivityLapSummary, ActivitySummary, ActivityZoneDetailed)

-- | <http://strava.github.io/api/v3/activities/#create>
createActivity
  :: Client
  -> Name
  -> ActivityType
  -> StartTime
  -> ElapsedTime
  -> CreateActivityOptions
  -> IO (Result ActivityDetailed)
createActivity :: Client
-> Name
-> ActivityType
-> StartTime
-> ElapsedTime
-> CreateActivityOptions
-> IO (Result ActivityDetailed)
createActivity Client
client Name
name ActivityType
type_ StartTime
startDateLocal ElapsedTime
elapsedTime CreateActivityOptions
options = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
post
  Client
client
  Name
resource
  Query
query
 where
  resource :: Name
resource = Name
"api/v3/activities"
  query :: Query
query =
    forall a. QueryLike a => a -> Query
toQuery
        [ (Name
"name", Name
name)
        , (Name
"type", forall a. Show a => a -> Name
show ActivityType
type_)
        , (Name
"start_date_local", ByteString -> Name
unpack (ByteString -> ByteString
toStrict (forall a. ToJSON a => a -> ByteString
encode StartTime
startDateLocal)))
        , (Name
"elapsed_time", forall a. Show a => a -> Name
show ElapsedTime
elapsedTime)
        ]
      forall a. Semigroup a => a -> a -> a
<> forall a. QueryLike a => a -> Query
toQuery CreateActivityOptions
options

-- | <http://strava.github.io/api/v3/activities/#get-details>
getActivity
  :: Client -> ActivityId -> GetActivityOptions -> IO (Result ActivitySummary)
getActivity :: Client
-> ElapsedTime -> GetActivityOptions -> IO (Result ActivitySummary)
getActivity Client
client ElapsedTime
activityId GetActivityOptions
options = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource Query
query
 where
  resource :: Name
resource = Name
"api/v3/activities/" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Name
show ElapsedTime
activityId
  query :: Query
query = forall a. QueryLike a => a -> Query
toQuery GetActivityOptions
options

-- | <http://strava.github.io/api/v3/activities/#put-updates>
updateActivity
  :: Client
  -> ActivityId
  -> UpdateActivityOptions
  -> IO (Result ActivityDetailed)
updateActivity :: Client
-> ElapsedTime
-> UpdateActivityOptions
-> IO (Result ActivityDetailed)
updateActivity Client
client ElapsedTime
activityId UpdateActivityOptions
options = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
put Client
client Name
resource Query
query
 where
  resource :: Name
resource = Name
"api/v3/activities/" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Name
show ElapsedTime
activityId
  query :: Query
query = forall a. QueryLike a => a -> Query
toQuery UpdateActivityOptions
options

-- | <http://strava.github.io/api/v3/activities/#delete>
deleteActivity :: Client -> ActivityId -> IO (Result ())
deleteActivity :: Client -> ElapsedTime -> IO (Result ())
deleteActivity Client
client ElapsedTime
activityId = do
  Request
request <- forall q.
QueryLike q =>
ByteString -> Client -> Name -> q -> IO Request
buildRequest ByteString
methodDelete Client
client Name
resource Query
query
  Response ByteString
response <- Client -> Request -> IO (Response ByteString)
performRequest Client
client Request
request
  forall (m :: * -> *) a. Monad m => a -> m a
return
    (if forall body. Response body -> Status
responseStatus Response ByteString
response forall a. Eq a => a -> a -> Bool
== Status
noContent204
      then forall a b. b -> Either a b
Right ()
      else forall a b. a -> Either a b
Left (Response ByteString
response, ByteString -> Name
unpack (ByteString -> ByteString
toStrict (forall body. Response body -> body
responseBody Response ByteString
response)))
    )
 where
  resource :: Name
resource = Name
"api/v3/activities/" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Name
show ElapsedTime
activityId
  query :: Query
query = [] :: Query

-- | <http://strava.github.io/api/v3/activities/#get-activities>
getCurrentActivities
  :: Client -> GetCurrentActivitiesOptions -> IO (Result [ActivitySummary])
getCurrentActivities :: Client
-> GetCurrentActivitiesOptions -> IO (Result [ActivitySummary])
getCurrentActivities Client
client GetCurrentActivitiesOptions
options = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource Query
query
 where
  resource :: Name
resource = Name
"api/v3/athlete/activities"
  query :: Query
query = forall a. QueryLike a => a -> Query
toQuery GetCurrentActivitiesOptions
options

-- | <http://strava.github.io/api/v3/activities/#get-related>
getRelatedActivities
  :: Client
  -> ActivityId
  -> GetRelatedActivitiesOptions
  -> IO (Result [ActivitySummary])
getRelatedActivities :: Client
-> ElapsedTime
-> GetRelatedActivitiesOptions
-> IO (Result [ActivitySummary])
getRelatedActivities Client
client ElapsedTime
activityId GetRelatedActivitiesOptions
options = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource Query
query
 where
  resource :: Name
resource = Name
"api/v3/activities/" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Name
show ElapsedTime
activityId forall a. Semigroup a => a -> a -> a
<> Name
"/related"
  query :: Query
query = forall a. QueryLike a => a -> Query
toQuery GetRelatedActivitiesOptions
options

-- | <http://strava.github.io/api/v3/activities/#get-feed>
getFeed :: Client -> GetFeedOptions -> IO (Result [ActivitySummary])
getFeed :: Client
-> GetRelatedActivitiesOptions -> IO (Result [ActivitySummary])
getFeed Client
client GetRelatedActivitiesOptions
options = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource Query
query
 where
  resource :: Name
resource = Name
"api/v3/activities/following"
  query :: Query
query = forall a. QueryLike a => a -> Query
toQuery GetRelatedActivitiesOptions
options

-- | <http://strava.github.io/api/v3/activities/#zones>
getActivityZones :: Client -> ActivityId -> IO (Result [ActivityZoneDetailed])
getActivityZones :: Client -> ElapsedTime -> IO (Result [ActivityZoneDetailed])
getActivityZones Client
client ElapsedTime
activityId = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource Query
query
 where
  resource :: Name
resource = Name
"api/v3/activities/" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Name
show ElapsedTime
activityId forall a. Semigroup a => a -> a -> a
<> Name
"/zones"
  query :: Query
query = [] :: Query

-- | <http://strava.github.io/api/v3/activities/#laps>
getActivityLaps :: Client -> ActivityId -> IO (Result [ActivityLapSummary])
getActivityLaps :: Client -> ElapsedTime -> IO (Result [ActivityLapSummary])
getActivityLaps Client
client ElapsedTime
activityId = forall q j.
(QueryLike q, FromJSON j) =>
Client -> Name -> q -> IO (Result j)
get Client
client Name
resource Query
query
 where
  resource :: Name
resource = Name
"api/v3/activities/" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> Name
show ElapsedTime
activityId forall a. Semigroup a => a -> a -> a
<> Name
"/laps"
  query :: Query
query = [] :: Query