{-# 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
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
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
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
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
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>
newtype SegmentExplorerResponse = SegmentExplorerResponse
  { SegmentExplorerResponse -> [SegmentExplorerEntry]
segmentExplorerResponse_segments :: [SegmentExplorerEntry]
  }
  deriving (Int -> SegmentExplorerResponse -> ShowS
[SegmentExplorerResponse] -> ShowS
SegmentExplorerResponse -> String
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)