{-# LANGUAGE TemplateHaskell #-}

-- | <http://strava.github.io/api/v3/segments/>
module Strive.Types.Segments
  ( SegmentDetailed(..)
  , SegmentSummary(..)
  , SegmentLeaderboardResponse(..)
  , SegmentLeaderboardEntry(..)
  , SegmentExplorerResponse(..)
  , SegmentExplorerEntry(..)
  ) where

import Data.Aeson.TH (deriveFromJSON)
import Data.Text (Text)
import Data.Time.Clock (UTCTime)
import Strive.Enums (ActivityType, Gender, ResourceState)
import Strive.Internal.TH (options)
import Strive.Types.Polylines (Polyline, PolylineDetailed)

-- | <http://strava.github.io/api/v3/segments/#detailed>
data SegmentDetailed = SegmentDetailed
  { SegmentDetailed -> ActivityType
segmentDetailed_activityType :: ActivityType
  , SegmentDetailed -> Integer
segmentDetailed_athleteCount :: Integer
  , SegmentDetailed -> Double
segmentDetailed_averageGrade :: Double
  , SegmentDetailed -> Text
segmentDetailed_city :: Text
  , SegmentDetailed -> Integer
segmentDetailed_climbCategory :: Integer
  , SegmentDetailed -> Text
segmentDetailed_country :: Text
  , SegmentDetailed -> UTCTime
segmentDetailed_createdAt :: UTCTime
  , SegmentDetailed -> Double
segmentDetailed_distance :: Double
  , SegmentDetailed -> Integer
segmentDetailed_effortCount :: Integer
  , SegmentDetailed -> Double
segmentDetailed_elevationHigh :: Double
  , SegmentDetailed -> Double
segmentDetailed_elevationLow :: Double
  , SegmentDetailed -> Double
segmentDetailed_endLatitude :: Double
  , SegmentDetailed -> (Double, Double)
segmentDetailed_endLatlng :: (Double, Double)
  , SegmentDetailed -> Double
segmentDetailed_endLongitude :: Double
  , SegmentDetailed -> Bool
segmentDetailed_hazardous :: Bool
  , SegmentDetailed -> Integer
segmentDetailed_id :: Integer
  , SegmentDetailed -> PolylineDetailed
segmentDetailed_map :: PolylineDetailed
  , SegmentDetailed -> Double
segmentDetailed_maximumGrade :: Double
  , SegmentDetailed -> Text
segmentDetailed_name :: Text
  , SegmentDetailed -> Bool
segmentDetailed_private :: Bool
  , SegmentDetailed -> ResourceState
segmentDetailed_resourceState :: ResourceState
  , SegmentDetailed -> Integer
segmentDetailed_starCount :: Integer
  , SegmentDetailed -> Bool
segmentDetailed_starred :: Bool
  , SegmentDetailed -> Double
segmentDetailed_startLatitude :: Double
  , SegmentDetailed -> (Double, Double)
segmentDetailed_startLatlng :: (Double, Double)
  , SegmentDetailed -> Double
segmentDetailed_startLongitude :: Double
  , SegmentDetailed -> Text
segmentDetailed_state :: Text
  , SegmentDetailed -> Double
segmentDetailed_totalElevationGain :: Double
  , SegmentDetailed -> UTCTime
segmentDetailed_updatedAt :: UTCTime
  }
  deriving Int -> SegmentDetailed -> ShowS
[SegmentDetailed] -> ShowS
SegmentDetailed -> String
(Int -> SegmentDetailed -> ShowS)
-> (SegmentDetailed -> String)
-> ([SegmentDetailed] -> ShowS)
-> Show SegmentDetailed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SegmentDetailed] -> ShowS
$cshowList :: [SegmentDetailed] -> ShowS
show :: SegmentDetailed -> String
$cshow :: SegmentDetailed -> String
showsPrec :: Int -> SegmentDetailed -> ShowS
$cshowsPrec :: Int -> SegmentDetailed -> ShowS
Show

$(deriveFromJSON options ''SegmentDetailed)

-- | <http://strava.github.io/api/v3/segments/#summary>
data SegmentSummary = SegmentSummary
  { SegmentSummary -> ActivityType
segmentSummary_activityType :: ActivityType
  , SegmentSummary -> Double
segmentSummary_averageGrade :: Double
  , SegmentSummary -> Text
segmentSummary_city :: Text
  , SegmentSummary -> Integer
segmentSummary_climbCategory :: Integer
  , SegmentSummary -> Text
segmentSummary_country :: Text
  , SegmentSummary -> Double
segmentSummary_distance :: Double
  , SegmentSummary -> Double
segmentSummary_elevationHigh :: Double
  , SegmentSummary -> Double
segmentSummary_elevationLow :: Double
  , SegmentSummary -> Double
segmentSummary_endLatitude :: Double
  , SegmentSummary -> (Double, Double)
segmentSummary_endLatlng :: (Double, Double)
  , SegmentSummary -> Double
segmentSummary_endLongitude :: Double
  , SegmentSummary -> Integer
segmentSummary_id :: Integer
  , SegmentSummary -> Double
segmentSummary_maximumGrade :: Double
  , SegmentSummary -> Text
segmentSummary_name :: Text
  , SegmentSummary -> Bool
segmentSummary_private :: Bool
  , SegmentSummary -> ResourceState
segmentSummary_resourceState :: ResourceState
  , SegmentSummary -> Bool
segmentSummary_starred :: Bool
  , SegmentSummary -> Double
segmentSummary_startLatitude :: Double
  , SegmentSummary -> (Double, Double)
segmentSummary_startLatlng :: (Double, Double)
  , SegmentSummary -> Double
segmentSummary_startLongitude :: Double
  , SegmentSummary -> Text
segmentSummary_state :: Text
  }
  deriving Int -> SegmentSummary -> ShowS
[SegmentSummary] -> ShowS
SegmentSummary -> String
(Int -> SegmentSummary -> ShowS)
-> (SegmentSummary -> String)
-> ([SegmentSummary] -> ShowS)
-> Show SegmentSummary
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SegmentSummary] -> ShowS
$cshowList :: [SegmentSummary] -> ShowS
show :: SegmentSummary -> String
$cshow :: SegmentSummary -> String
showsPrec :: Int -> SegmentSummary -> ShowS
$cshowsPrec :: Int -> SegmentSummary -> ShowS
Show

$(deriveFromJSON options ''SegmentSummary)

-- | <http://strava.github.io/api/v3/segments/#leaderboard>
data SegmentLeaderboardEntry = SegmentLeaderboardEntry
  { SegmentLeaderboardEntry -> Integer
segmentLeaderboardEntry_activityId :: Integer
  , SegmentLeaderboardEntry -> Maybe Gender
segmentLeaderboardEntry_athleteGender :: Maybe Gender
  , SegmentLeaderboardEntry -> Integer
segmentLeaderboardEntry_athleteId :: Integer
  , SegmentLeaderboardEntry -> Text
segmentLeaderboardEntry_athleteName :: Text
  , SegmentLeaderboardEntry -> Text
segmentLeaderboardEntry_athleteProfile :: Text
  , SegmentLeaderboardEntry -> Double
segmentLeaderboardEntry_averageHr :: Double
  , SegmentLeaderboardEntry -> Double
segmentLeaderboardEntry_averageWatts :: Double
  , SegmentLeaderboardEntry -> Double
segmentLeaderboardEntry_distance :: Double
  , SegmentLeaderboardEntry -> Integer
segmentLeaderboardEntry_effortId :: Integer
  , SegmentLeaderboardEntry -> Integer
segmentLeaderboardEntry_elapsedTime :: Integer
  , SegmentLeaderboardEntry -> Integer
segmentLeaderboardEntry_movingTime :: Integer
  , SegmentLeaderboardEntry -> Integer
segmentLeaderboardEntry_rank :: Integer
  , SegmentLeaderboardEntry -> UTCTime
segmentLeaderboardEntry_startDate :: UTCTime
  , SegmentLeaderboardEntry -> UTCTime
segmentLeaderboardEntry_startDateLocal :: UTCTime
  }
  deriving Int -> SegmentLeaderboardEntry -> ShowS
[SegmentLeaderboardEntry] -> ShowS
SegmentLeaderboardEntry -> String
(Int -> SegmentLeaderboardEntry -> ShowS)
-> (SegmentLeaderboardEntry -> String)
-> ([SegmentLeaderboardEntry] -> ShowS)
-> Show SegmentLeaderboardEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SegmentLeaderboardEntry] -> ShowS
$cshowList :: [SegmentLeaderboardEntry] -> ShowS
show :: SegmentLeaderboardEntry -> String
$cshow :: SegmentLeaderboardEntry -> String
showsPrec :: Int -> SegmentLeaderboardEntry -> ShowS
$cshowsPrec :: Int -> SegmentLeaderboardEntry -> ShowS
Show

$(deriveFromJSON options ''SegmentLeaderboardEntry)

-- | <http://strava.github.io/api/v3/segments/#leaderboard>
data SegmentLeaderboardResponse = SegmentLeaderboardResponse
  { SegmentLeaderboardResponse -> Integer
segmentLeaderboardResponse_effortCount :: Integer
  , SegmentLeaderboardResponse -> Integer
segmentLeaderboardResponse_entryCount :: Integer
  , SegmentLeaderboardResponse -> [SegmentLeaderboardEntry]
segmentLeaderboardResponse_entries :: [SegmentLeaderboardEntry]
  }
  deriving Int -> SegmentLeaderboardResponse -> ShowS
[SegmentLeaderboardResponse] -> ShowS
SegmentLeaderboardResponse -> String
(Int -> SegmentLeaderboardResponse -> ShowS)
-> (SegmentLeaderboardResponse -> String)
-> ([SegmentLeaderboardResponse] -> ShowS)
-> Show SegmentLeaderboardResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SegmentLeaderboardResponse] -> ShowS
$cshowList :: [SegmentLeaderboardResponse] -> ShowS
show :: SegmentLeaderboardResponse -> String
$cshow :: SegmentLeaderboardResponse -> String
showsPrec :: Int -> SegmentLeaderboardResponse -> ShowS
$cshowsPrec :: Int -> SegmentLeaderboardResponse -> ShowS
Show

$(deriveFromJSON options ''SegmentLeaderboardResponse)

-- | <http://strava.github.io/api/v3/segments/#explore>
data SegmentExplorerEntry = SegmentExplorerEntry
  { SegmentExplorerEntry -> Double
segmentExplorerEntry_avgGrade :: Double
  , SegmentExplorerEntry -> Integer
segmentExplorerEntry_climbCategory :: Integer
  , SegmentExplorerEntry -> String
segmentExplorerEntry_climbCategoryDesc :: String
  , SegmentExplorerEntry -> Double
segmentExplorerEntry_distance :: Double
  , SegmentExplorerEntry -> Double
segmentExplorerEntry_elevDifference :: Double
  , SegmentExplorerEntry -> (Double, Double)
segmentExplorerEntry_endLatlng :: (Double, Double)
  , SegmentExplorerEntry -> Integer
segmentExplorerEntry_id :: Integer
  , SegmentExplorerEntry -> Text
segmentExplorerEntry_name :: Text
  , SegmentExplorerEntry -> Polyline
segmentExplorerEntry_points :: Polyline
  , SegmentExplorerEntry -> ResourceState
segmentExplorerEntry_resourceState :: ResourceState
  , SegmentExplorerEntry -> Bool
segmentExplorerEntry_starred :: Bool
  , SegmentExplorerEntry -> (Double, Double)
segmentExplorerEntry_startLatlng :: (Double, Double)
  }
  deriving Int -> SegmentExplorerEntry -> ShowS
[SegmentExplorerEntry] -> ShowS
SegmentExplorerEntry -> String
(Int -> SegmentExplorerEntry -> ShowS)
-> (SegmentExplorerEntry -> String)
-> ([SegmentExplorerEntry] -> ShowS)
-> Show SegmentExplorerEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SegmentExplorerEntry] -> ShowS
$cshowList :: [SegmentExplorerEntry] -> ShowS
show :: SegmentExplorerEntry -> String
$cshow :: SegmentExplorerEntry -> String
showsPrec :: Int -> SegmentExplorerEntry -> ShowS
$cshowsPrec :: Int -> SegmentExplorerEntry -> ShowS
Show

$(deriveFromJSON options ''SegmentExplorerEntry)

-- | <http://strava.github.io/api/v3/segments/#explore>
data SegmentExplorerResponse = SegmentExplorerResponse
  { SegmentExplorerResponse -> [SegmentExplorerEntry]
segmentExplorerResponse_segments :: [SegmentExplorerEntry]
  }
  deriving Int -> SegmentExplorerResponse -> ShowS
[SegmentExplorerResponse] -> ShowS
SegmentExplorerResponse -> String
(Int -> SegmentExplorerResponse -> ShowS)
-> (SegmentExplorerResponse -> String)
-> ([SegmentExplorerResponse] -> ShowS)
-> Show SegmentExplorerResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SegmentExplorerResponse] -> ShowS
$cshowList :: [SegmentExplorerResponse] -> ShowS
show :: SegmentExplorerResponse -> String
$cshow :: SegmentExplorerResponse -> String
showsPrec :: Int -> SegmentExplorerResponse -> ShowS
$cshowsPrec :: Int -> SegmentExplorerResponse -> ShowS
Show

$(deriveFromJSON options ''SegmentExplorerResponse)