{-# 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
(Int -> EffortDetailed -> ShowS)
-> (EffortDetailed -> String)
-> ([EffortDetailed] -> ShowS)
-> Show EffortDetailed
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
      (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)
-> Parser Integer
-> Parser
     (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)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Object
o Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"activity") Parser Object -> (Object -> Parser Integer) -> Parser Integer
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"))
      Parser
  (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)
-> Parser Integer
-> Parser
     (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)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((Object
o Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"athlete") Parser Object -> (Object -> Parser Integer) -> Parser Integer
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"))
      Parser
  (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)
-> Parser (Maybe Double)
-> Parser
     (Maybe Double
      -> Maybe Double
      -> Double
      -> Integer
      -> Integer
      -> Maybe Bool
      -> Integer
      -> Maybe Integer
      -> Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser (Maybe Double)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"average_cadence"
      Parser
  (Maybe Double
   -> Maybe Double
   -> Double
   -> Integer
   -> Integer
   -> Maybe Bool
   -> Integer
   -> Maybe Integer
   -> Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser (Maybe Double)
-> Parser
     (Maybe Double
      -> Double
      -> Integer
      -> Integer
      -> Maybe Bool
      -> Integer
      -> Maybe Integer
      -> Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser (Maybe Double)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"average_heartrate"
      Parser
  (Maybe Double
   -> Double
   -> Integer
   -> Integer
   -> Maybe Bool
   -> Integer
   -> Maybe Integer
   -> Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser (Maybe Double)
-> Parser
     (Double
      -> Integer
      -> Integer
      -> Maybe Bool
      -> Integer
      -> Maybe Integer
      -> Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser (Maybe Double)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"average_watts"
      Parser
  (Double
   -> Integer
   -> Integer
   -> Maybe Bool
   -> Integer
   -> Maybe Integer
   -> Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser Double
-> Parser
     (Integer
      -> Integer
      -> Maybe Bool
      -> Integer
      -> Maybe Integer
      -> Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser Double
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"distance"
      Parser
  (Integer
   -> Integer
   -> Maybe Bool
   -> Integer
   -> Maybe Integer
   -> Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser Integer
-> Parser
     (Integer
      -> Maybe Bool
      -> Integer
      -> Maybe Integer
      -> Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"elapsed_time"
      Parser
  (Integer
   -> Maybe Bool
   -> Integer
   -> Maybe Integer
   -> Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser Integer
-> Parser
     (Maybe Bool
      -> Integer
      -> Maybe Integer
      -> Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"end_index"
      Parser
  (Maybe Bool
   -> Integer
   -> Maybe Integer
   -> Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser (Maybe Bool)
-> Parser
     (Integer
      -> Maybe Integer
      -> Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"hidden"
      Parser
  (Integer
   -> Maybe Integer
   -> Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser Integer
-> Parser
     (Maybe Integer
      -> Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
      Parser
  (Maybe Integer
   -> Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser (Maybe Integer)
-> Parser
     (Maybe Integer
      -> Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"kom_rank"
      Parser
  (Maybe Integer
   -> Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser (Maybe Integer)
-> Parser
     (Integer
      -> Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"max_heartrate"
      Parser
  (Integer
   -> Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser Integer
-> Parser
     (Text
      -> Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"moving_time"
      Parser
  (Text
   -> Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser Text
-> Parser
     (Maybe Integer
      -> ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"
      Parser
  (Maybe Integer
   -> ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser (Maybe Integer)
-> Parser
     (ResourceState
      -> SegmentSummary
      -> UTCTime
      -> UTCTime
      -> Integer
      -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"pr_rank"
      Parser
  (ResourceState
   -> SegmentSummary
   -> UTCTime
   -> UTCTime
   -> Integer
   -> EffortDetailed)
-> Parser ResourceState
-> Parser
     (SegmentSummary -> UTCTime -> UTCTime -> Integer -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser ResourceState
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"resource_state"
      Parser
  (SegmentSummary -> UTCTime -> UTCTime -> Integer -> EffortDetailed)
-> Parser SegmentSummary
-> Parser (UTCTime -> UTCTime -> Integer -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser SegmentSummary
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"segment"
      Parser (UTCTime -> UTCTime -> Integer -> EffortDetailed)
-> Parser UTCTime -> Parser (UTCTime -> Integer -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser UTCTime
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"start_date"
      Parser (UTCTime -> Integer -> EffortDetailed)
-> Parser UTCTime -> Parser (Integer -> EffortDetailed)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser UTCTime
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"start_date_local"
      Parser (Integer -> EffortDetailed)
-> Parser Integer -> Parser EffortDetailed
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o
      Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"start_index"
  parseJSON Value
_ = Parser EffortDetailed
forall (f :: * -> *) a. Alternative f => f a
empty