-- | '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
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
      { createActivityOptions_description :: Maybe String
createActivityOptions_description = forall a. Maybe a
Nothing,
        createActivityOptions_distance :: Maybe Double
createActivityOptions_distance = forall a. Maybe a
Nothing
      }

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

-- | 'Strive.Actions.GetActivity'
newtype GetActivityOptions = GetActivityOptions
  { GetActivityOptions -> Bool
getActivityOptions_allEfforts :: Bool
  }
  deriving (Int -> GetActivityOptions -> ShowS
[GetActivityOptions] -> ShowS
GetActivityOptions -> String
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 {getActivityOptions_allEfforts :: Bool
getActivityOptions_allEfforts = Bool
False}

instance QueryLike GetActivityOptions where
  toQuery :: GetActivityOptions -> Query
toQuery GetActivityOptions
options =
    forall a. QueryLike a => a -> Query
toQuery
      [ ( String
"approval_prompt",
          ByteString -> String
unpack (ByteString -> ByteString
toStrict (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
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
      { updateActivityOptions_name :: Maybe String
updateActivityOptions_name = forall a. Maybe a
Nothing,
        updateActivityOptions_type :: Maybe ActivityType
updateActivityOptions_type = forall a. Maybe a
Nothing,
        updateActivityOptions_private :: Maybe Bool
updateActivityOptions_private = forall a. Maybe a
Nothing,
        updateActivityOptions_commute :: Maybe Bool
updateActivityOptions_commute = forall a. Maybe a
Nothing,
        updateActivityOptions_trainer :: Maybe Bool
updateActivityOptions_trainer = forall a. Maybe a
Nothing,
        updateActivityOptions_gearId :: Maybe String
updateActivityOptions_gearId = forall a. Maybe a
Nothing,
        updateActivityOptions_description :: Maybe String
updateActivityOptions_description = forall a. Maybe a
Nothing
      }

instance QueryLike UpdateActivityOptions where
  toQuery :: UpdateActivityOptions -> Query
toQuery UpdateActivityOptions
options =
    forall a. QueryLike a => a -> Query
toQuery
      [ (String
"name", UpdateActivityOptions -> Maybe String
updateActivityOptions_name UpdateActivityOptions
options),
        (String
"type", forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Show a => a -> String
show (UpdateActivityOptions -> Maybe ActivityType
updateActivityOptions_type UpdateActivityOptions
options)),
        ( String
"private",
          forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
            (ByteString -> String
unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
encode)
            (UpdateActivityOptions -> Maybe Bool
updateActivityOptions_private UpdateActivityOptions
options)
        ),
        ( String
"commute",
          forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
            (ByteString -> String
unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ToJSON a => a -> ByteString
encode)
            (UpdateActivityOptions -> Maybe Bool
updateActivityOptions_commute UpdateActivityOptions
options)
        ),
        ( String
"trainer",
          forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
            (ByteString -> String
unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> ByteString
toStrict forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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
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
      { getCurrentActivitiesOptions_before :: Maybe UTCTime
getCurrentActivitiesOptions_before = forall a. Maybe a
Nothing,
        getCurrentActivitiesOptions_after :: Maybe UTCTime
getCurrentActivitiesOptions_after = 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 =
    forall a. QueryLike a => a -> Query
toQuery
      [ ( String
"before",
          forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
            (forall a. Show a => a -> String
show forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> POSIXTime
utcTimeToPOSIXSeconds)
            (GetCurrentActivitiesOptions -> Maybe UTCTime
getCurrentActivitiesOptions_before GetCurrentActivitiesOptions
options)
        ),
        ( String
"after",
          forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
            (forall a. Show a => a -> String
show forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> POSIXTime
utcTimeToPOSIXSeconds)
            (GetCurrentActivitiesOptions -> Maybe UTCTime
getCurrentActivitiesOptions_after GetCurrentActivitiesOptions
options)
        ),
        (String
"page", forall a. a -> Maybe a
Just (forall a. Show a => a -> String
show (GetCurrentActivitiesOptions -> Integer
getCurrentActivitiesOptions_page GetCurrentActivitiesOptions
options))),
        (String
"per_page", forall a. a -> Maybe a
Just (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