-- | 'Strive.Actions.Activities'
module Strive.Options.Activities
  ( CreateActivityOptions (..)
  , GetActivityOptions (..)
  , UpdateActivityOptions (..)
  , GetCurrentActivitiesOptions (..)
  , GetRelatedActivitiesOptions
  , GetFeedOptions
  ) where

import Data.Aeson (encode)
import Data.ByteString.Char8 (unpack)
import Data.ByteString.Lazy (toStrict)
import Data.Default (Default, def)
import Data.Time.Clock (UTCTime)
import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds)
import Network.HTTP.Types (QueryLike, toQuery)
import Strive.Enums (ActivityType)
import Strive.Internal.Options (PaginationOptions)

-- | 'Strive.Actions.CreateActivity'
data CreateActivityOptions = CreateActivityOptions
  { CreateActivityOptions -> Maybe String
createActivityOptions_description :: Maybe String
  , CreateActivityOptions -> Maybe Double
createActivityOptions_distance    :: Maybe Double
  } deriving Int -> CreateActivityOptions -> ShowS
[CreateActivityOptions] -> ShowS
CreateActivityOptions -> String
(Int -> CreateActivityOptions -> ShowS)
-> (CreateActivityOptions -> String)
-> ([CreateActivityOptions] -> ShowS)
-> Show CreateActivityOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateActivityOptions] -> ShowS
$cshowList :: [CreateActivityOptions] -> ShowS
show :: CreateActivityOptions -> String
$cshow :: CreateActivityOptions -> String
showsPrec :: Int -> CreateActivityOptions -> ShowS
$cshowsPrec :: Int -> CreateActivityOptions -> ShowS
Show

instance Default CreateActivityOptions where
  def :: CreateActivityOptions
def = CreateActivityOptions :: Maybe String -> Maybe Double -> CreateActivityOptions
CreateActivityOptions
    { createActivityOptions_description :: Maybe String
createActivityOptions_description = Maybe String
forall a. Maybe a
Nothing
    , createActivityOptions_distance :: Maybe Double
createActivityOptions_distance = Maybe Double
forall a. Maybe a
Nothing
    }

instance QueryLike CreateActivityOptions where
  toQuery :: CreateActivityOptions -> Query
toQuery CreateActivityOptions
options = [(String, Maybe String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (String
"description", CreateActivityOptions -> Maybe String
createActivityOptions_description CreateActivityOptions
options)
    , (String
"distance", (Double -> String) -> Maybe Double -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Double -> String
forall a. Show a => a -> String
show (CreateActivityOptions -> Maybe Double
createActivityOptions_distance CreateActivityOptions
options))
    ]

-- | 'Strive.Actions.GetActivity'
data GetActivityOptions = GetActivityOptions
  { GetActivityOptions -> Bool
getActivityOptions_allEfforts :: Bool
  } deriving Int -> GetActivityOptions -> ShowS
[GetActivityOptions] -> ShowS
GetActivityOptions -> String
(Int -> GetActivityOptions -> ShowS)
-> (GetActivityOptions -> String)
-> ([GetActivityOptions] -> ShowS)
-> Show GetActivityOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetActivityOptions] -> ShowS
$cshowList :: [GetActivityOptions] -> ShowS
show :: GetActivityOptions -> String
$cshow :: GetActivityOptions -> String
showsPrec :: Int -> GetActivityOptions -> ShowS
$cshowsPrec :: Int -> GetActivityOptions -> ShowS
Show

instance Default GetActivityOptions where
  def :: GetActivityOptions
def = GetActivityOptions :: Bool -> GetActivityOptions
GetActivityOptions
    { getActivityOptions_allEfforts :: Bool
getActivityOptions_allEfforts = Bool
False
    }

instance QueryLike GetActivityOptions where
  toQuery :: GetActivityOptions -> Query
toQuery GetActivityOptions
options = [(String, String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (String
"approval_prompt", ByteString -> String
unpack (ByteString -> ByteString
toStrict (Bool -> ByteString
forall a. ToJSON a => a -> ByteString
encode (GetActivityOptions -> Bool
getActivityOptions_allEfforts GetActivityOptions
options))))
    ]

-- | 'Strive.Actions.UpdateActivity'
data UpdateActivityOptions = UpdateActivityOptions
  { UpdateActivityOptions -> Maybe String
updateActivityOptions_name        :: Maybe String
  , UpdateActivityOptions -> Maybe ActivityType
updateActivityOptions_type        :: Maybe ActivityType
  , UpdateActivityOptions -> Maybe Bool
updateActivityOptions_private     :: Maybe Bool
  , UpdateActivityOptions -> Maybe Bool
updateActivityOptions_commute     :: Maybe Bool
  , UpdateActivityOptions -> Maybe Bool
updateActivityOptions_trainer     :: Maybe Bool
  , UpdateActivityOptions -> Maybe String
updateActivityOptions_gearId      :: Maybe String
  , UpdateActivityOptions -> Maybe String
updateActivityOptions_description :: Maybe String
  } deriving Int -> UpdateActivityOptions -> ShowS
[UpdateActivityOptions] -> ShowS
UpdateActivityOptions -> String
(Int -> UpdateActivityOptions -> ShowS)
-> (UpdateActivityOptions -> String)
-> ([UpdateActivityOptions] -> ShowS)
-> Show UpdateActivityOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UpdateActivityOptions] -> ShowS
$cshowList :: [UpdateActivityOptions] -> ShowS
show :: UpdateActivityOptions -> String
$cshow :: UpdateActivityOptions -> String
showsPrec :: Int -> UpdateActivityOptions -> ShowS
$cshowsPrec :: Int -> UpdateActivityOptions -> ShowS
Show

instance Default UpdateActivityOptions where
  def :: UpdateActivityOptions
def = UpdateActivityOptions :: Maybe String
-> Maybe ActivityType
-> Maybe Bool
-> Maybe Bool
-> Maybe Bool
-> Maybe String
-> Maybe String
-> UpdateActivityOptions
UpdateActivityOptions
    { updateActivityOptions_name :: Maybe String
updateActivityOptions_name = Maybe String
forall a. Maybe a
Nothing
    , updateActivityOptions_type :: Maybe ActivityType
updateActivityOptions_type = Maybe ActivityType
forall a. Maybe a
Nothing
    , updateActivityOptions_private :: Maybe Bool
updateActivityOptions_private = Maybe Bool
forall a. Maybe a
Nothing
    , updateActivityOptions_commute :: Maybe Bool
updateActivityOptions_commute = Maybe Bool
forall a. Maybe a
Nothing
    , updateActivityOptions_trainer :: Maybe Bool
updateActivityOptions_trainer = Maybe Bool
forall a. Maybe a
Nothing
    , updateActivityOptions_gearId :: Maybe String
updateActivityOptions_gearId = Maybe String
forall a. Maybe a
Nothing
    , updateActivityOptions_description :: Maybe String
updateActivityOptions_description = Maybe String
forall a. Maybe a
Nothing
    }

instance QueryLike UpdateActivityOptions where
  toQuery :: UpdateActivityOptions -> Query
toQuery UpdateActivityOptions
options = [(String, Maybe String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (String
"name", UpdateActivityOptions -> Maybe String
updateActivityOptions_name UpdateActivityOptions
options)
    , (String
"type", (ActivityType -> String) -> Maybe ActivityType -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ActivityType -> String
forall a. Show a => a -> String
show (UpdateActivityOptions -> Maybe ActivityType
updateActivityOptions_type UpdateActivityOptions
options))
    , (String
"private", (Bool -> String) -> Maybe Bool -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ByteString -> String
unpack (ByteString -> String) -> (Bool -> ByteString) -> Bool -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict (ByteString -> ByteString)
-> (Bool -> ByteString) -> Bool -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> ByteString
forall a. ToJSON a => a -> ByteString
encode) (UpdateActivityOptions -> Maybe Bool
updateActivityOptions_private UpdateActivityOptions
options))
    , (String
"commute", (Bool -> String) -> Maybe Bool -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ByteString -> String
unpack (ByteString -> String) -> (Bool -> ByteString) -> Bool -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict (ByteString -> ByteString)
-> (Bool -> ByteString) -> Bool -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> ByteString
forall a. ToJSON a => a -> ByteString
encode) (UpdateActivityOptions -> Maybe Bool
updateActivityOptions_commute UpdateActivityOptions
options))
    , (String
"trainer", (Bool -> String) -> Maybe Bool -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ByteString -> String
unpack (ByteString -> String) -> (Bool -> ByteString) -> Bool -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict (ByteString -> ByteString)
-> (Bool -> ByteString) -> Bool -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> ByteString
forall a. ToJSON a => a -> ByteString
encode) (UpdateActivityOptions -> Maybe Bool
updateActivityOptions_trainer UpdateActivityOptions
options))
    , (String
"gear_id", UpdateActivityOptions -> Maybe String
updateActivityOptions_gearId UpdateActivityOptions
options)
    , (String
"description", UpdateActivityOptions -> Maybe String
updateActivityOptions_description UpdateActivityOptions
options)
    ]

-- | 'Strive.Actions.getCurrentActivities'
data GetCurrentActivitiesOptions = GetCurrentActivitiesOptions
  { GetCurrentActivitiesOptions -> Maybe UTCTime
getCurrentActivitiesOptions_before  :: Maybe UTCTime
  , GetCurrentActivitiesOptions -> Maybe UTCTime
getCurrentActivitiesOptions_after   :: Maybe UTCTime
  , GetCurrentActivitiesOptions -> Integer
getCurrentActivitiesOptions_page    :: Integer
  , GetCurrentActivitiesOptions -> Integer
getCurrentActivitiesOptions_perPage :: Integer
  } deriving Int -> GetCurrentActivitiesOptions -> ShowS
[GetCurrentActivitiesOptions] -> ShowS
GetCurrentActivitiesOptions -> String
(Int -> GetCurrentActivitiesOptions -> ShowS)
-> (GetCurrentActivitiesOptions -> String)
-> ([GetCurrentActivitiesOptions] -> ShowS)
-> Show GetCurrentActivitiesOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetCurrentActivitiesOptions] -> ShowS
$cshowList :: [GetCurrentActivitiesOptions] -> ShowS
show :: GetCurrentActivitiesOptions -> String
$cshow :: GetCurrentActivitiesOptions -> String
showsPrec :: Int -> GetCurrentActivitiesOptions -> ShowS
$cshowsPrec :: Int -> GetCurrentActivitiesOptions -> ShowS
Show

instance Default GetCurrentActivitiesOptions where
  def :: GetCurrentActivitiesOptions
def = GetCurrentActivitiesOptions :: Maybe UTCTime
-> Maybe UTCTime
-> Integer
-> Integer
-> GetCurrentActivitiesOptions
GetCurrentActivitiesOptions
    { getCurrentActivitiesOptions_before :: Maybe UTCTime
getCurrentActivitiesOptions_before = Maybe UTCTime
forall a. Maybe a
Nothing
    , getCurrentActivitiesOptions_after :: Maybe UTCTime
getCurrentActivitiesOptions_after = Maybe UTCTime
forall a. Maybe a
Nothing
    , getCurrentActivitiesOptions_page :: Integer
getCurrentActivitiesOptions_page = Integer
1
    , getCurrentActivitiesOptions_perPage :: Integer
getCurrentActivitiesOptions_perPage = Integer
200
    }

instance QueryLike GetCurrentActivitiesOptions where
  toQuery :: GetCurrentActivitiesOptions -> Query
toQuery GetCurrentActivitiesOptions
options = [(String, Maybe String)] -> Query
forall a. QueryLike a => a -> Query
toQuery
    [ (String
"before", (UTCTime -> String) -> Maybe UTCTime -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (POSIXTime -> String
forall a. Show a => a -> String
show (POSIXTime -> String)
-> (UTCTime -> POSIXTime) -> UTCTime -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> POSIXTime
utcTimeToPOSIXSeconds) (GetCurrentActivitiesOptions -> Maybe UTCTime
getCurrentActivitiesOptions_before GetCurrentActivitiesOptions
options))
    , (String
"after", (UTCTime -> String) -> Maybe UTCTime -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (POSIXTime -> String
forall a. Show a => a -> String
show (POSIXTime -> String)
-> (UTCTime -> POSIXTime) -> UTCTime -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> POSIXTime
utcTimeToPOSIXSeconds) (GetCurrentActivitiesOptions -> Maybe UTCTime
getCurrentActivitiesOptions_after GetCurrentActivitiesOptions
options))
    , (String
"page", String -> Maybe String
forall a. a -> Maybe a
Just (Integer -> String
forall a. Show a => a -> String
show (GetCurrentActivitiesOptions -> Integer
getCurrentActivitiesOptions_page GetCurrentActivitiesOptions
options)))
    , (String
"per_page", String -> Maybe String
forall a. a -> Maybe a
Just (Integer -> String
forall a. Show a => a -> String
show (GetCurrentActivitiesOptions -> Integer
getCurrentActivitiesOptions_perPage GetCurrentActivitiesOptions
options)))
    ]

-- | 'Strive.Actions.getRelatedActivities'
type GetRelatedActivitiesOptions = PaginationOptions

-- | 'Strive.Actions.getFeed'
type GetFeedOptions = PaginationOptions