{-# 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
$cshowsPrec :: Int -> Polyline -> ShowS
showsPrec :: Int -> Polyline -> ShowS
$cshow :: Polyline -> String
show :: Polyline -> String
$cshowList :: [Polyline] -> ShowS
showList :: [Polyline] -> ShowS
Show)

instance FromJSON Polyline where
  parseJSON :: Value -> Parser Polyline
parseJSON = (String -> Polyline) -> Parser String -> Parser Polyline
forall a b. (a -> b) -> Parser a -> Parser b
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
$cshowsPrec :: Int -> PolylineDetailed -> ShowS
showsPrec :: Int -> PolylineDetailed -> ShowS
$cshow :: PolylineDetailed -> String
show :: PolylineDetailed -> String
$cshowList :: [PolylineDetailed] -> ShowS
showList :: [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
$cshowsPrec :: Int -> PolylineSummary -> ShowS
showsPrec :: Int -> PolylineSummary -> ShowS
$cshow :: PolylineSummary -> String
show :: PolylineSummary -> String
$cshowList :: [PolylineSummary] -> ShowS
showList :: [PolylineSummary] -> ShowS
Show)

$(deriveFromJSON options ''PolylineSummary)