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