{-# LANGUAGE OverloadedStrings #-}

-- | <http://strava.github.io/api/v3/efforts/>
module Strive.Types.Efforts
  ( EffortDetailed (..),
  )
where

import Control.Applicative (empty)
import Data.Aeson (FromJSON, Value (Object), parseJSON, (.:), (.:?))
import Data.Text (Text)
import Data.Time.Clock (UTCTime)
import Strive.Enums (ResourceState)
import Strive.Types.Segments (SegmentSummary)

-- | <http://strava.github.io/api/v3/efforts/#detailed>
data EffortDetailed = EffortDetailed
  { EffortDetailed -> Integer
effortDetailed_activityId :: Integer,
    EffortDetailed -> Integer
effortDetailed_athleteId :: Integer,
    EffortDetailed -> Maybe Double
effortDetailed_averageCadence :: Maybe Double,
    EffortDetailed -> Maybe Double
effortDetailed_averageHeartrate :: Maybe Double,
    EffortDetailed -> Maybe Double
effortDetailed_averageWatts :: Maybe Double,
    EffortDetailed -> Double
effortDetailed_distance :: Double,
    EffortDetailed -> Integer
effortDetailed_elapsedTime :: Integer,
    EffortDetailed -> Integer
effortDetailed_endIndex :: Integer,
    EffortDetailed -> Maybe Bool
effortDetailed_hidden :: Maybe Bool,
    EffortDetailed -> Integer
effortDetailed_id :: Integer,
    EffortDetailed -> Maybe Integer
effortDetailed_komRank :: Maybe Integer,
    EffortDetailed -> Maybe Integer
effortDetailed_maxHeartrate :: Maybe Integer,
    EffortDetailed -> Integer
effortDetailed_movingTime :: Integer,
    EffortDetailed -> Text
effortDetailed_name :: Text,
    EffortDetailed -> Maybe Integer
effortDetailed_prRank :: Maybe Integer,
    EffortDetailed -> ResourceState
effortDetailed_resourceState :: ResourceState,
    EffortDetailed -> SegmentSummary
effortDetailed_segment :: SegmentSummary,
    EffortDetailed -> UTCTime
effortDetailed_startDate :: UTCTime,
    EffortDetailed -> UTCTime
effortDetailed_startDateLocal :: UTCTime,
    EffortDetailed -> Integer
effortDetailed_startIndex :: Integer
  }
  deriving (Int -> EffortDetailed -> ShowS
[EffortDetailed] -> ShowS
EffortDetailed -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EffortDetailed] -> ShowS
$cshowList :: [EffortDetailed] -> ShowS
show :: EffortDetailed -> String
$cshow :: EffortDetailed -> String
showsPrec :: Int -> EffortDetailed -> ShowS
$cshowsPrec :: Int -> EffortDetailed -> ShowS
Show)

instance FromJSON EffortDetailed where
  parseJSON :: Value -> Parser EffortDetailed
parseJSON (Object Object
o) =
    Integer
-> Integer
-> Maybe Double
-> Maybe Double
-> Maybe Double
-> Double
-> Integer
-> Integer
-> Maybe Bool
-> Integer
-> Maybe Integer
-> Maybe Integer
-> Integer
-> Text
-> Maybe Integer
-> ResourceState
-> SegmentSummary
-> UTCTime
-> UTCTime
-> Integer
-> EffortDetailed
EffortDetailed
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"activity") forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"))
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((Object
o forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"athlete") forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"))
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"average_cadence"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"average_heartrate"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"average_watts"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"distance"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"elapsed_time"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"end_index"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"hidden"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"kom_rank"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"max_heartrate"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"moving_time"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"pr_rank"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"resource_state"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"segment"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"start_date"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"start_date_local"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
        forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"start_index"
  parseJSON Value
_ = forall (f :: * -> *) a. Alternative f => f a
empty