{-# LANGUAGE TemplateHaskell #-}

-- | <http://strava.github.io/api/v3/athlete/>
module Strive.Types.Athletes
  ( AthleteDetailed (..)
  , AthleteSummary (..)
  , AthleteMeta (..)
  , ActivityTotals (..)
  , AthleteStats (..)
  ) where

import Data.Aeson.TH (deriveFromJSON)
import Data.Text (Text)
import Data.Time.Clock (UTCTime)
import Strive.Enums (Gender, MeasurementPreference, ResourceState)
import Strive.Internal.TH (options)
import Strive.Types.Clubs (ClubSummary)
import Strive.Types.Gear (GearSummary)

-- | <http://strava.github.io/api/v3/athlete/#detailed>
data AthleteDetailed = AthleteDetailed
  { AthleteDetailed -> [GearSummary]
athleteDetailed_bikes                 :: [GearSummary]
  , AthleteDetailed -> Text
athleteDetailed_city                  :: Text
  , AthleteDetailed -> [ClubSummary]
athleteDetailed_clubs                 :: [ClubSummary]
  , AthleteDetailed -> Text
athleteDetailed_country               :: Text
  , AthleteDetailed -> UTCTime
athleteDetailed_createdAt             :: UTCTime
  , AthleteDetailed -> Text
athleteDetailed_datePreference        :: Text
  , AthleteDetailed -> Text
athleteDetailed_email                 :: Text
  , AthleteDetailed -> Text
athleteDetailed_firstname             :: Text
  , AthleteDetailed -> Maybe Text
athleteDetailed_follower              :: Maybe Text
  , AthleteDetailed -> Integer
athleteDetailed_followerCount         :: Integer
  , AthleteDetailed -> Maybe Text
athleteDetailed_friend                :: Maybe Text
  , AthleteDetailed -> Integer
athleteDetailed_friendCount           :: Integer
  , AthleteDetailed -> Maybe Integer
athleteDetailed_ftp                   :: Maybe Integer
  , AthleteDetailed -> Integer
athleteDetailed_id                    :: Integer
  , AthleteDetailed -> Text
athleteDetailed_lastname              :: Text
  , AthleteDetailed -> MeasurementPreference
athleteDetailed_measurementPreference :: MeasurementPreference
  , AthleteDetailed -> Integer
athleteDetailed_mutualFriendCount     :: Integer
  , AthleteDetailed -> Bool
athleteDetailed_premium               :: Bool
  , AthleteDetailed -> Text
athleteDetailed_profile               :: Text
  , AthleteDetailed -> Text
athleteDetailed_profileMedium         :: Text
  , AthleteDetailed -> ResourceState
athleteDetailed_resourceState         :: ResourceState
  , AthleteDetailed -> Maybe Gender
athleteDetailed_sex                   :: Maybe Gender
  , AthleteDetailed -> [GearSummary]
athleteDetailed_shoes                 :: [GearSummary]
  , AthleteDetailed -> Maybe Text
athleteDetailed_state                 :: Maybe Text
  , AthleteDetailed -> UTCTime
athleteDetailed_updatedAt             :: UTCTime
  , AthleteDetailed -> Maybe Double
athleteDetailed_weight                :: Maybe Double
  } deriving Int -> AthleteDetailed -> ShowS
[AthleteDetailed] -> ShowS
AthleteDetailed -> String
(Int -> AthleteDetailed -> ShowS)
-> (AthleteDetailed -> String)
-> ([AthleteDetailed] -> ShowS)
-> Show AthleteDetailed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AthleteDetailed] -> ShowS
$cshowList :: [AthleteDetailed] -> ShowS
show :: AthleteDetailed -> String
$cshow :: AthleteDetailed -> String
showsPrec :: Int -> AthleteDetailed -> ShowS
$cshowsPrec :: Int -> AthleteDetailed -> ShowS
Show

$(deriveFromJSON options ''AthleteDetailed)

-- | <http://strava.github.io/api/v3/athlete/#summary>
data AthleteSummary = AthleteSummary
  { AthleteSummary -> Maybe Text
athleteSummary_city          :: Maybe Text
  , AthleteSummary -> Maybe Text
athleteSummary_country       :: Maybe Text
  , AthleteSummary -> UTCTime
athleteSummary_createdAt     :: UTCTime
  , AthleteSummary -> Text
athleteSummary_firstname     :: Text
  , AthleteSummary -> Maybe Text
athleteSummary_follower      :: Maybe Text
  , AthleteSummary -> Maybe Text
athleteSummary_friend        :: Maybe Text
  , AthleteSummary -> Integer
athleteSummary_id            :: Integer
  , AthleteSummary -> Text
athleteSummary_lastname      :: Text
  , AthleteSummary -> Bool
athleteSummary_premium       :: Bool
  , AthleteSummary -> Text
athleteSummary_profile       :: Text
  , AthleteSummary -> Text
athleteSummary_profileMedium :: Text
  , AthleteSummary -> ResourceState
athleteSummary_resourceState :: ResourceState
  , AthleteSummary -> Maybe Gender
athleteSummary_sex           :: Maybe Gender
  , AthleteSummary -> Maybe Text
athleteSummary_state         :: Maybe Text
  , AthleteSummary -> UTCTime
athleteSummary_updatedAt     :: UTCTime
  } deriving Int -> AthleteSummary -> ShowS
[AthleteSummary] -> ShowS
AthleteSummary -> String
(Int -> AthleteSummary -> ShowS)
-> (AthleteSummary -> String)
-> ([AthleteSummary] -> ShowS)
-> Show AthleteSummary
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AthleteSummary] -> ShowS
$cshowList :: [AthleteSummary] -> ShowS
show :: AthleteSummary -> String
$cshow :: AthleteSummary -> String
showsPrec :: Int -> AthleteSummary -> ShowS
$cshowsPrec :: Int -> AthleteSummary -> ShowS
Show

$(deriveFromJSON options ''AthleteSummary)

-- | <http://strava.github.io/api/v3/athlete/#meta>
data AthleteMeta = AthleteMeta
  { AthleteMeta -> Integer
athleteMeta_id            :: Integer
  , AthleteMeta -> ResourceState
athleteMeta_resourceState :: ResourceState
  } deriving Int -> AthleteMeta -> ShowS
[AthleteMeta] -> ShowS
AthleteMeta -> String
(Int -> AthleteMeta -> ShowS)
-> (AthleteMeta -> String)
-> ([AthleteMeta] -> ShowS)
-> Show AthleteMeta
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AthleteMeta] -> ShowS
$cshowList :: [AthleteMeta] -> ShowS
show :: AthleteMeta -> String
$cshow :: AthleteMeta -> String
showsPrec :: Int -> AthleteMeta -> ShowS
$cshowsPrec :: Int -> AthleteMeta -> ShowS
Show

$(deriveFromJSON options ''AthleteMeta)

-- | <http://strava.github.io/api/v3/athlete/#stats>
data ActivityTotals = ActivityTotals
  { ActivityTotals -> Integer
activityTotals_count            :: Integer
  , ActivityTotals -> Double
activityTotals_distance         :: Double
  , ActivityTotals -> Double
activityTotals_movingTime       :: Double
  , ActivityTotals -> Double
activityTotals_elapsedTime      :: Double
  , ActivityTotals -> Double
activityTotals_elevationGain    :: Double
  , ActivityTotals -> Double
activityTotals_achievementCount :: Double
  } deriving Int -> ActivityTotals -> ShowS
[ActivityTotals] -> ShowS
ActivityTotals -> String
(Int -> ActivityTotals -> ShowS)
-> (ActivityTotals -> String)
-> ([ActivityTotals] -> ShowS)
-> Show ActivityTotals
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ActivityTotals] -> ShowS
$cshowList :: [ActivityTotals] -> ShowS
show :: ActivityTotals -> String
$cshow :: ActivityTotals -> String
showsPrec :: Int -> ActivityTotals -> ShowS
$cshowsPrec :: Int -> ActivityTotals -> ShowS
Show

$(deriveFromJSON options ''ActivityTotals)

-- | <http://strava.github.io/api/v3/athlete/#stats>
data AthleteStats = AthleteStats
  { AthleteStats -> Double
athleteStats_biggestRideDistance       :: Double
  , AthleteStats -> Double
athleteStats_biggestClimbElevationGain :: Double
  , AthleteStats -> ActivityTotals
athleteStats_recentRideTotals          :: ActivityTotals
  , AthleteStats -> ActivityTotals
athleteStats_recentRunTotals           :: ActivityTotals
  , AthleteStats -> ActivityTotals
athleteStats_ytdRideTotals             :: ActivityTotals
  , AthleteStats -> ActivityTotals
athleteStats_ytdRunTotals              :: ActivityTotals
  , AthleteStats -> ActivityTotals
athleteStats_allRideTotals             :: ActivityTotals
  , AthleteStats -> ActivityTotals
athleteStats_allRunTotals              :: ActivityTotals
  } deriving Int -> AthleteStats -> ShowS
[AthleteStats] -> ShowS
AthleteStats -> String
(Int -> AthleteStats -> ShowS)
-> (AthleteStats -> String)
-> ([AthleteStats] -> ShowS)
-> Show AthleteStats
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AthleteStats] -> ShowS
$cshowList :: [AthleteStats] -> ShowS
show :: AthleteStats -> String
$cshow :: AthleteStats -> String
showsPrec :: Int -> AthleteStats -> ShowS
$cshowsPrec :: Int -> AthleteStats -> ShowS
Show

$(deriveFromJSON options ''AthleteStats)