{-# LANGUAGE TemplateHaskell #-}

-- | <http://strava.github.io/api/#polylines>
module Strive.Types.Polylines
  ( Polyline (..),
    PolylineDetailed (..),
    PolylineSummary (..),
  )
where

import Data.Aeson (FromJSON, parseJSON)
import Data.Aeson.TH (deriveFromJSON)
import Data.Text (Text)
import GPolyline (decodeline)
import Strive.Enums (ResourceState)
import Strive.Internal.TH (options)

-- | <http://strava.github.io/api/#polylines>
newtype Polyline = Polyline {Polyline -> [(Double, Double)]
unPolyline :: [(Double, Double)]} deriving (Int -> Polyline -> ShowS
[Polyline] -> ShowS
Polyline -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Polyline] -> ShowS
$cshowList :: [Polyline] -> ShowS
show :: Polyline -> String
$cshow :: Polyline -> String
showsPrec :: Int -> Polyline -> ShowS
$cshowsPrec :: Int -> Polyline -> ShowS
Show)

instance FromJSON Polyline where
  parseJSON :: Value -> Parser Polyline
parseJSON = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([(Double, Double)] -> Polyline
Polyline forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [(Double, Double)]
decodeline) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. FromJSON a => Value -> Parser a
parseJSON

-- | <http://strava.github.io/api/v3/activities/#detailed>
data PolylineDetailed = PolylineDetailed
  { PolylineDetailed -> Text
polylineDetailed_id :: Text,
    PolylineDetailed -> Polyline
polylineDetailed_polyline :: Polyline,
    PolylineDetailed -> ResourceState
polylineDetailed_resourceState :: ResourceState,
    PolylineDetailed -> Maybe Polyline
polylineDetailed_summaryPolyline :: Maybe Polyline
  }
  deriving (Int -> PolylineDetailed -> ShowS
[PolylineDetailed] -> ShowS
PolylineDetailed -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PolylineDetailed] -> ShowS
$cshowList :: [PolylineDetailed] -> ShowS
show :: PolylineDetailed -> String
$cshow :: PolylineDetailed -> String
showsPrec :: Int -> PolylineDetailed -> ShowS
$cshowsPrec :: Int -> PolylineDetailed -> ShowS
Show)

$(deriveFromJSON options ''PolylineDetailed)

-- | <http://strava.github.io/api/v3/activities/#summary>
data PolylineSummary = PolylineSummary
  { PolylineSummary -> Text
polylineSummary_id :: Text,
    PolylineSummary -> ResourceState
polylineSummary_resourceState :: ResourceState,
    PolylineSummary -> Maybe Polyline
polylineSummary_summaryPolyline :: Maybe Polyline
  }
  deriving (Int -> PolylineSummary -> ShowS
[PolylineSummary] -> ShowS
PolylineSummary -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PolylineSummary] -> ShowS
$cshowList :: [PolylineSummary] -> ShowS
show :: PolylineSummary -> String
$cshow :: PolylineSummary -> String
showsPrec :: Int -> PolylineSummary -> ShowS
$cshowsPrec :: Int -> PolylineSummary -> ShowS
Show)

$(deriveFromJSON options ''PolylineSummary)