-- | 'Strive.Actions.Segments'
module Strive.Options.Segments
  ( GetStarredSegmentsOptions
  , GetSegmentEffortsOptions(..)
  , GetSegmentLeaderboardOptions(..)
  , ExploreSegmentsOptions(..)
  ) where

import Data.Aeson (encode)
import Data.ByteString.Char8 (unpack)
import Data.ByteString.Lazy (toStrict)
import Data.Default (Default, def)
import Data.Time.Clock (UTCTime)
import Network.HTTP.Types (QueryLike, toQuery)
import Strive.Enums
  (AgeGroup, Gender, SegmentActivityType(Riding), WeightClass)
import Strive.Internal.Options (PaginationOptions)

-- | 'Strive.Actions.getStarredSegments'
type GetStarredSegmentsOptions = PaginationOptions

-- | 'Strive.Actions.getSegmentEfforts'
data GetSegmentEffortsOptions = GetSegmentEffortsOptions
  { GetSegmentEffortsOptions -> Maybe Integer
getSegmentEffortsOptions_athleteId :: Maybe Integer
  , GetSegmentEffortsOptions -> Maybe (UTCTime, UTCTime)
getSegmentEffortsOptions_range :: Maybe (UTCTime, UTCTime)
  , GetSegmentEffortsOptions -> Integer
getSegmentEffortsOptions_page :: Integer
  , GetSegmentEffortsOptions -> Integer
getSegmentEffortsOptions_perPage :: Integer
  }
  deriving Int -> GetSegmentEffortsOptions -> ShowS
[GetSegmentEffortsOptions] -> ShowS
GetSegmentEffortsOptions -> String
(Int -> GetSegmentEffortsOptions -> ShowS)
-> (GetSegmentEffortsOptions -> String)
-> ([GetSegmentEffortsOptions] -> ShowS)
-> Show GetSegmentEffortsOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetSegmentEffortsOptions] -> ShowS
$cshowList :: [GetSegmentEffortsOptions] -> ShowS
show :: GetSegmentEffortsOptions -> String
$cshow :: GetSegmentEffortsOptions -> String
showsPrec :: Int -> GetSegmentEffortsOptions -> ShowS
$cshowsPrec :: Int -> GetSegmentEffortsOptions -> ShowS
Show

instance Default GetSegmentEffortsOptions where
  def :: GetSegmentEffortsOptions
def = GetSegmentEffortsOptions :: Maybe Integer
-> Maybe (UTCTime, UTCTime)
-> Integer
-> Integer
-> GetSegmentEffortsOptions
GetSegmentEffortsOptions
    { getSegmentEffortsOptions_athleteId :: Maybe Integer
getSegmentEffortsOptions_athleteId = Maybe Integer
forall a. Maybe a
Nothing
    , getSegmentEffortsOptions_range :: Maybe (UTCTime, UTCTime)
getSegmentEffortsOptions_range = Maybe (UTCTime, UTCTime)
forall a. Maybe a
Nothing
    , getSegmentEffortsOptions_page :: Integer
getSegmentEffortsOptions_page = Integer
1
    , getSegmentEffortsOptions_perPage :: Integer
getSegmentEffortsOptions_perPage = Integer
200
    }

instance QueryLike GetSegmentEffortsOptions where
  toQuery :: GetSegmentEffortsOptions -> Query
toQuery GetSegmentEffortsOptions
options = [(String, Maybe String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (String
"athlete_id", (Integer -> String) -> Maybe Integer -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Integer -> String
forall a. Show a => a -> String
show (GetSegmentEffortsOptions -> Maybe Integer
getSegmentEffortsOptions_athleteId GetSegmentEffortsOptions
options))
    , ( String
"start_date_local"
      , ((UTCTime, UTCTime) -> String)
-> Maybe (UTCTime, UTCTime) -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
        (ByteString -> String
unpack (ByteString -> String)
-> ((UTCTime, UTCTime) -> ByteString)
-> (UTCTime, UTCTime)
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict (ByteString -> ByteString)
-> ((UTCTime, UTCTime) -> ByteString)
-> (UTCTime, UTCTime)
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> ByteString
forall a. ToJSON a => a -> ByteString
encode (UTCTime -> ByteString)
-> ((UTCTime, UTCTime) -> UTCTime)
-> (UTCTime, UTCTime)
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UTCTime, UTCTime) -> UTCTime
forall a b. (a, b) -> a
fst)
        (GetSegmentEffortsOptions -> Maybe (UTCTime, UTCTime)
getSegmentEffortsOptions_range GetSegmentEffortsOptions
options)
      )
    , ( String
"end_date_local"
      , ((UTCTime, UTCTime) -> String)
-> Maybe (UTCTime, UTCTime) -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
        (ByteString -> String
unpack (ByteString -> String)
-> ((UTCTime, UTCTime) -> ByteString)
-> (UTCTime, UTCTime)
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict (ByteString -> ByteString)
-> ((UTCTime, UTCTime) -> ByteString)
-> (UTCTime, UTCTime)
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> ByteString
forall a. ToJSON a => a -> ByteString
encode (UTCTime -> ByteString)
-> ((UTCTime, UTCTime) -> UTCTime)
-> (UTCTime, UTCTime)
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UTCTime, UTCTime) -> UTCTime
forall a b. (a, b) -> b
snd)
        (GetSegmentEffortsOptions -> Maybe (UTCTime, UTCTime)
getSegmentEffortsOptions_range GetSegmentEffortsOptions
options)
      )
    , (String
"page", String -> Maybe String
forall a. a -> Maybe a
Just (Integer -> String
forall a. Show a => a -> String
show (GetSegmentEffortsOptions -> Integer
getSegmentEffortsOptions_page GetSegmentEffortsOptions
options)))
    , (String
"per_page", String -> Maybe String
forall a. a -> Maybe a
Just (Integer -> String
forall a. Show a => a -> String
show (GetSegmentEffortsOptions -> Integer
getSegmentEffortsOptions_perPage GetSegmentEffortsOptions
options)))
    ]

-- | 'Strive.Actions.getSegmentLeaderboard'
data GetSegmentLeaderboardOptions = GetSegmentLeaderboardOptions
  { GetSegmentLeaderboardOptions -> Maybe Gender
getSegmentLeaderboardOptions_gender :: Maybe Gender
  , GetSegmentLeaderboardOptions -> Maybe AgeGroup
getSegmentLeaderboardOptions_ageGroup :: Maybe AgeGroup
  , GetSegmentLeaderboardOptions -> Maybe WeightClass
getSegmentLeaderboardOptions_weightClass :: Maybe WeightClass
  , GetSegmentLeaderboardOptions -> Maybe Bool
getSegmentLeaderboardOptions_following :: Maybe Bool
  , GetSegmentLeaderboardOptions -> Maybe Integer
getSegmentLeaderboardOptions_clubId :: Maybe Integer
  , GetSegmentLeaderboardOptions -> Maybe String
getSegmentLeaderboardOptions_dateRange :: Maybe String
  , GetSegmentLeaderboardOptions -> Maybe Integer
getSegmentLeaderboardOptions_contextEntries :: Maybe Integer
  , GetSegmentLeaderboardOptions -> Integer
getSegmentLeaderboardOptions_page :: Integer
  , GetSegmentLeaderboardOptions -> Integer
getSegmentLeaderboardOptions_perPage :: Integer
  }
  deriving Int -> GetSegmentLeaderboardOptions -> ShowS
[GetSegmentLeaderboardOptions] -> ShowS
GetSegmentLeaderboardOptions -> String
(Int -> GetSegmentLeaderboardOptions -> ShowS)
-> (GetSegmentLeaderboardOptions -> String)
-> ([GetSegmentLeaderboardOptions] -> ShowS)
-> Show GetSegmentLeaderboardOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetSegmentLeaderboardOptions] -> ShowS
$cshowList :: [GetSegmentLeaderboardOptions] -> ShowS
show :: GetSegmentLeaderboardOptions -> String
$cshow :: GetSegmentLeaderboardOptions -> String
showsPrec :: Int -> GetSegmentLeaderboardOptions -> ShowS
$cshowsPrec :: Int -> GetSegmentLeaderboardOptions -> ShowS
Show

instance Default GetSegmentLeaderboardOptions where
  def :: GetSegmentLeaderboardOptions
def = GetSegmentLeaderboardOptions :: Maybe Gender
-> Maybe AgeGroup
-> Maybe WeightClass
-> Maybe Bool
-> Maybe Integer
-> Maybe String
-> Maybe Integer
-> Integer
-> Integer
-> GetSegmentLeaderboardOptions
GetSegmentLeaderboardOptions
    { getSegmentLeaderboardOptions_gender :: Maybe Gender
getSegmentLeaderboardOptions_gender = Maybe Gender
forall a. Maybe a
Nothing
    , getSegmentLeaderboardOptions_ageGroup :: Maybe AgeGroup
getSegmentLeaderboardOptions_ageGroup = Maybe AgeGroup
forall a. Maybe a
Nothing
    , getSegmentLeaderboardOptions_weightClass :: Maybe WeightClass
getSegmentLeaderboardOptions_weightClass = Maybe WeightClass
forall a. Maybe a
Nothing
    , getSegmentLeaderboardOptions_following :: Maybe Bool
getSegmentLeaderboardOptions_following = Maybe Bool
forall a. Maybe a
Nothing
    , getSegmentLeaderboardOptions_clubId :: Maybe Integer
getSegmentLeaderboardOptions_clubId = Maybe Integer
forall a. Maybe a
Nothing
    , getSegmentLeaderboardOptions_dateRange :: Maybe String
getSegmentLeaderboardOptions_dateRange = Maybe String
forall a. Maybe a
Nothing
    , getSegmentLeaderboardOptions_contextEntries :: Maybe Integer
getSegmentLeaderboardOptions_contextEntries = Maybe Integer
forall a. Maybe a
Nothing
    , getSegmentLeaderboardOptions_page :: Integer
getSegmentLeaderboardOptions_page = Integer
1
    , getSegmentLeaderboardOptions_perPage :: Integer
getSegmentLeaderboardOptions_perPage = Integer
200
    }

instance QueryLike GetSegmentLeaderboardOptions where
  toQuery :: GetSegmentLeaderboardOptions -> Query
toQuery GetSegmentLeaderboardOptions
options = [(String, Maybe String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (String
"gender", (Gender -> String) -> Maybe Gender -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Gender -> String
forall a. Show a => a -> String
show (GetSegmentLeaderboardOptions -> Maybe Gender
getSegmentLeaderboardOptions_gender GetSegmentLeaderboardOptions
options))
    , (String
"age_group", (AgeGroup -> String) -> Maybe AgeGroup -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AgeGroup -> String
forall a. Show a => a -> String
show (GetSegmentLeaderboardOptions -> Maybe AgeGroup
getSegmentLeaderboardOptions_ageGroup GetSegmentLeaderboardOptions
options))
    , ( String
"weight_class"
      , (WeightClass -> String) -> Maybe WeightClass -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap WeightClass -> String
forall a. Show a => a -> String
show (GetSegmentLeaderboardOptions -> Maybe WeightClass
getSegmentLeaderboardOptions_weightClass GetSegmentLeaderboardOptions
options)
      )
    , ( String
"following"
      , (Bool -> String) -> Maybe Bool -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
        (ByteString -> String
unpack (ByteString -> String) -> (Bool -> ByteString) -> Bool -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict (ByteString -> ByteString)
-> (Bool -> ByteString) -> Bool -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> ByteString
forall a. ToJSON a => a -> ByteString
encode)
        (GetSegmentLeaderboardOptions -> Maybe Bool
getSegmentLeaderboardOptions_following GetSegmentLeaderboardOptions
options)
      )
    , (String
"club_id", (Integer -> String) -> Maybe Integer -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Integer -> String
forall a. Show a => a -> String
show (GetSegmentLeaderboardOptions -> Maybe Integer
getSegmentLeaderboardOptions_clubId GetSegmentLeaderboardOptions
options))
    , (String
"date_range", GetSegmentLeaderboardOptions -> Maybe String
getSegmentLeaderboardOptions_dateRange GetSegmentLeaderboardOptions
options)
    , ( String
"context_entries"
      , (Integer -> String) -> Maybe Integer -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Integer -> String
forall a. Show a => a -> String
show (GetSegmentLeaderboardOptions -> Maybe Integer
getSegmentLeaderboardOptions_contextEntries GetSegmentLeaderboardOptions
options)
      )
    , (String
"page", String -> Maybe String
forall a. a -> Maybe a
Just (Integer -> String
forall a. Show a => a -> String
show (GetSegmentLeaderboardOptions -> Integer
getSegmentLeaderboardOptions_page GetSegmentLeaderboardOptions
options)))
    , (String
"per_page", String -> Maybe String
forall a. a -> Maybe a
Just (Integer -> String
forall a. Show a => a -> String
show (GetSegmentLeaderboardOptions -> Integer
getSegmentLeaderboardOptions_perPage GetSegmentLeaderboardOptions
options)))
    ]

-- | 'Strive.Actions.exploreSegments'
data ExploreSegmentsOptions = ExploreSegmentsOptions
  { ExploreSegmentsOptions -> SegmentActivityType
exploreSegmentsOptions_activityType :: SegmentActivityType
  , ExploreSegmentsOptions -> Integer
exploreSegmentsOptions_minCat :: Integer
  , ExploreSegmentsOptions -> Integer
exploreSegmentsOptions_maxCat :: Integer
  }
  deriving Int -> ExploreSegmentsOptions -> ShowS
[ExploreSegmentsOptions] -> ShowS
ExploreSegmentsOptions -> String
(Int -> ExploreSegmentsOptions -> ShowS)
-> (ExploreSegmentsOptions -> String)
-> ([ExploreSegmentsOptions] -> ShowS)
-> Show ExploreSegmentsOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ExploreSegmentsOptions] -> ShowS
$cshowList :: [ExploreSegmentsOptions] -> ShowS
show :: ExploreSegmentsOptions -> String
$cshow :: ExploreSegmentsOptions -> String
showsPrec :: Int -> ExploreSegmentsOptions -> ShowS
$cshowsPrec :: Int -> ExploreSegmentsOptions -> ShowS
Show

instance Default ExploreSegmentsOptions where
  def :: ExploreSegmentsOptions
def = ExploreSegmentsOptions :: SegmentActivityType -> Integer -> Integer -> ExploreSegmentsOptions
ExploreSegmentsOptions
    { exploreSegmentsOptions_activityType :: SegmentActivityType
exploreSegmentsOptions_activityType = SegmentActivityType
Riding
    , exploreSegmentsOptions_minCat :: Integer
exploreSegmentsOptions_minCat = Integer
0
    , exploreSegmentsOptions_maxCat :: Integer
exploreSegmentsOptions_maxCat = Integer
5
    }

instance QueryLike ExploreSegmentsOptions where
  toQuery :: ExploreSegmentsOptions -> Query
toQuery ExploreSegmentsOptions
options = [(String, String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (String
"activity_type", SegmentActivityType -> String
forall a. Show a => a -> String
show (ExploreSegmentsOptions -> SegmentActivityType
exploreSegmentsOptions_activityType ExploreSegmentsOptions
options))
    , (String
"min_cat", Integer -> String
forall a. Show a => a -> String
show (ExploreSegmentsOptions -> Integer
exploreSegmentsOptions_minCat ExploreSegmentsOptions
options))
    , (String
"max_cat", Integer -> String
forall a. Show a => a -> String
show (ExploreSegmentsOptions -> Integer
exploreSegmentsOptions_maxCat ExploreSegmentsOptions
options))
    ]