{-# 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
(Int -> Polyline -> ShowS)
-> (Polyline -> String) -> ([Polyline] -> ShowS) -> Show Polyline
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 = (String -> Polyline) -> Parser String -> Parser Polyline
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([(Double, Double)] -> Polyline
Polyline ([(Double, Double)] -> Polyline)
-> (String -> [(Double, Double)]) -> String -> Polyline
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [(Double, Double)]
decodeline) (Parser String -> Parser Polyline)
-> (Value -> Parser String) -> Value -> Parser Polyline
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Parser String
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
(Int -> PolylineDetailed -> ShowS)
-> (PolylineDetailed -> String)
-> ([PolylineDetailed] -> ShowS)
-> Show PolylineDetailed
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
(Int -> PolylineSummary -> ShowS)
-> (PolylineSummary -> String)
-> ([PolylineSummary] -> ShowS)
-> Show PolylineSummary
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)