{-# 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)