module Spotify.Servant.Player where

import Spotify.Servant.Core
import Spotify.Types.Internal.CustomJSON
import Spotify.Types.Misc
import Spotify.Types.Player

import Data.Aeson (FromJSON, ToJSON)
import GHC.Generics (Generic)
import Servant.API (
    JSON,
    QueryParam,
    QueryParam',
    ReqBody,
    Required,
    Strict,
    type (:>),
 )

type GetPlaybackState =
    "me"
        :> "player"
        :> QueryParam "market" Market
        :> SpotGet PlaybackState

type TransferPlayback =
    "me"
        :> "player"
        :> ReqBody '[JSON] TransferPlaybackBody
        :> SpotPutNoContent
data TransferPlaybackBody = TransferPlaybackBody
    { TransferPlaybackBody -> [DeviceID]
device_ids :: [DeviceID]
    , TransferPlaybackBody -> Bool
play :: Bool
    }
    deriving (TransferPlaybackBody -> TransferPlaybackBody -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
$c/= :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
== :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
$c== :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
Eq, Eq TransferPlaybackBody
TransferPlaybackBody -> TransferPlaybackBody -> Bool
TransferPlaybackBody -> TransferPlaybackBody -> Ordering
TransferPlaybackBody
-> TransferPlaybackBody -> TransferPlaybackBody
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: TransferPlaybackBody
-> TransferPlaybackBody -> TransferPlaybackBody
$cmin :: TransferPlaybackBody
-> TransferPlaybackBody -> TransferPlaybackBody
max :: TransferPlaybackBody
-> TransferPlaybackBody -> TransferPlaybackBody
$cmax :: TransferPlaybackBody
-> TransferPlaybackBody -> TransferPlaybackBody
>= :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
$c>= :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
> :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
$c> :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
<= :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
$c<= :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
< :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
$c< :: TransferPlaybackBody -> TransferPlaybackBody -> Bool
compare :: TransferPlaybackBody -> TransferPlaybackBody -> Ordering
$ccompare :: TransferPlaybackBody -> TransferPlaybackBody -> Ordering
Ord, Int -> TransferPlaybackBody -> ShowS
[TransferPlaybackBody] -> ShowS
TransferPlaybackBody -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TransferPlaybackBody] -> ShowS
$cshowList :: [TransferPlaybackBody] -> ShowS
show :: TransferPlaybackBody -> String
$cshow :: TransferPlaybackBody -> String
showsPrec :: Int -> TransferPlaybackBody -> ShowS
$cshowsPrec :: Int -> TransferPlaybackBody -> ShowS
Show, forall x. Rep TransferPlaybackBody x -> TransferPlaybackBody
forall x. TransferPlaybackBody -> Rep TransferPlaybackBody x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TransferPlaybackBody x -> TransferPlaybackBody
$cfrom :: forall x. TransferPlaybackBody -> Rep TransferPlaybackBody x
Generic)
    deriving ([TransferPlaybackBody] -> Encoding
[TransferPlaybackBody] -> Value
TransferPlaybackBody -> Encoding
TransferPlaybackBody -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [TransferPlaybackBody] -> Encoding
$ctoEncodingList :: [TransferPlaybackBody] -> Encoding
toJSONList :: [TransferPlaybackBody] -> Value
$ctoJSONList :: [TransferPlaybackBody] -> Value
toEncoding :: TransferPlaybackBody -> Encoding
$ctoEncoding :: TransferPlaybackBody -> Encoding
toJSON :: TransferPlaybackBody -> Value
$ctoJSON :: TransferPlaybackBody -> Value
ToJSON)

type GetAvailableDevices =
    "me"
        :> "player"
        :> "devices"
        :> SpotGet GetAvailableDevicesResponse
newtype GetAvailableDevicesResponse = GetAvailableDevicesResponse
    { GetAvailableDevicesResponse -> [Device]
devices :: [Device]
    }
    deriving (GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
$c/= :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
== :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
$c== :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
Eq, Eq GetAvailableDevicesResponse
GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
GetAvailableDevicesResponse
-> GetAvailableDevicesResponse -> Ordering
GetAvailableDevicesResponse
-> GetAvailableDevicesResponse -> GetAvailableDevicesResponse
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: GetAvailableDevicesResponse
-> GetAvailableDevicesResponse -> GetAvailableDevicesResponse
$cmin :: GetAvailableDevicesResponse
-> GetAvailableDevicesResponse -> GetAvailableDevicesResponse
max :: GetAvailableDevicesResponse
-> GetAvailableDevicesResponse -> GetAvailableDevicesResponse
$cmax :: GetAvailableDevicesResponse
-> GetAvailableDevicesResponse -> GetAvailableDevicesResponse
>= :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
$c>= :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
> :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
$c> :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
<= :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
$c<= :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
< :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
$c< :: GetAvailableDevicesResponse -> GetAvailableDevicesResponse -> Bool
compare :: GetAvailableDevicesResponse
-> GetAvailableDevicesResponse -> Ordering
$ccompare :: GetAvailableDevicesResponse
-> GetAvailableDevicesResponse -> Ordering
Ord, Int -> GetAvailableDevicesResponse -> ShowS
[GetAvailableDevicesResponse] -> ShowS
GetAvailableDevicesResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetAvailableDevicesResponse] -> ShowS
$cshowList :: [GetAvailableDevicesResponse] -> ShowS
show :: GetAvailableDevicesResponse -> String
$cshow :: GetAvailableDevicesResponse -> String
showsPrec :: Int -> GetAvailableDevicesResponse -> ShowS
$cshowsPrec :: Int -> GetAvailableDevicesResponse -> ShowS
Show, forall x.
Rep GetAvailableDevicesResponse x -> GetAvailableDevicesResponse
forall x.
GetAvailableDevicesResponse -> Rep GetAvailableDevicesResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetAvailableDevicesResponse x -> GetAvailableDevicesResponse
$cfrom :: forall x.
GetAvailableDevicesResponse -> Rep GetAvailableDevicesResponse x
Generic)
    deriving (Value -> Parser [GetAvailableDevicesResponse]
Value -> Parser GetAvailableDevicesResponse
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [GetAvailableDevicesResponse]
$cparseJSONList :: Value -> Parser [GetAvailableDevicesResponse]
parseJSON :: Value -> Parser GetAvailableDevicesResponse
$cparseJSON :: Value -> Parser GetAvailableDevicesResponse
FromJSON) via CustomJSON GetAvailableDevicesResponse

type GetCurrentlyPlayingTrack =
    "me"
        :> "player"
        :> "currently-playing"
        :> QueryParam "market" Market
        :> SpotGet CurrentlyPlayingTrack

type StartPlayback =
    "me"
        :> "player"
        :> "play"
        :> QueryParam "device_id" DeviceID
        :> ReqBody '[JSON] StartPlaybackOpts
        :> SpotPutNoContent
data StartPlaybackOpts = StartPlaybackOpts
    { StartPlaybackOpts -> Maybe URI
context_uri :: Maybe URI
    , StartPlaybackOpts -> Maybe [URI]
uris :: Maybe [URI]
    , StartPlaybackOpts -> Maybe Offset
offset :: Maybe Offset
    }
    deriving (StartPlaybackOpts -> StartPlaybackOpts -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
$c/= :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
== :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
$c== :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
Eq, Eq StartPlaybackOpts
StartPlaybackOpts -> StartPlaybackOpts -> Bool
StartPlaybackOpts -> StartPlaybackOpts -> Ordering
StartPlaybackOpts -> StartPlaybackOpts -> StartPlaybackOpts
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: StartPlaybackOpts -> StartPlaybackOpts -> StartPlaybackOpts
$cmin :: StartPlaybackOpts -> StartPlaybackOpts -> StartPlaybackOpts
max :: StartPlaybackOpts -> StartPlaybackOpts -> StartPlaybackOpts
$cmax :: StartPlaybackOpts -> StartPlaybackOpts -> StartPlaybackOpts
>= :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
$c>= :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
> :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
$c> :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
<= :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
$c<= :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
< :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
$c< :: StartPlaybackOpts -> StartPlaybackOpts -> Bool
compare :: StartPlaybackOpts -> StartPlaybackOpts -> Ordering
$ccompare :: StartPlaybackOpts -> StartPlaybackOpts -> Ordering
Ord, Int -> StartPlaybackOpts -> ShowS
[StartPlaybackOpts] -> ShowS
StartPlaybackOpts -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StartPlaybackOpts] -> ShowS
$cshowList :: [StartPlaybackOpts] -> ShowS
show :: StartPlaybackOpts -> String
$cshow :: StartPlaybackOpts -> String
showsPrec :: Int -> StartPlaybackOpts -> ShowS
$cshowsPrec :: Int -> StartPlaybackOpts -> ShowS
Show, forall x. Rep StartPlaybackOpts x -> StartPlaybackOpts
forall x. StartPlaybackOpts -> Rep StartPlaybackOpts x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep StartPlaybackOpts x -> StartPlaybackOpts
$cfrom :: forall x. StartPlaybackOpts -> Rep StartPlaybackOpts x
Generic)
    deriving ([StartPlaybackOpts] -> Encoding
[StartPlaybackOpts] -> Value
StartPlaybackOpts -> Encoding
StartPlaybackOpts -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [StartPlaybackOpts] -> Encoding
$ctoEncodingList :: [StartPlaybackOpts] -> Encoding
toJSONList :: [StartPlaybackOpts] -> Value
$ctoJSONList :: [StartPlaybackOpts] -> Value
toEncoding :: StartPlaybackOpts -> Encoding
$ctoEncoding :: StartPlaybackOpts -> Encoding
toJSON :: StartPlaybackOpts -> Value
$ctoJSON :: StartPlaybackOpts -> Value
ToJSON)
emptyStartPlaybackOpts :: StartPlaybackOpts
emptyStartPlaybackOpts :: StartPlaybackOpts
emptyStartPlaybackOpts = Maybe URI -> Maybe [URI] -> Maybe Offset -> StartPlaybackOpts
StartPlaybackOpts forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing

type PausePlayback =
    "me"
        :> "player"
        :> "pause"
        :> QueryParam "device_id" DeviceID
        :> SpotPutNoContent

type SkipToNext =
    "me"
        :> "player"
        :> "next"
        :> QueryParam "device_id" DeviceID
        :> SpotPostNoContent

type SkipToPrevious =
    "me"
        :> "player"
        :> "previous"
        :> QueryParam "device_id" DeviceID
        :> SpotPostNoContent

type SeekToPosition =
    "me"
        :> "player"
        :> "seek"
        :> QueryParam' '[Strict, Required] "position_ms" Int
        :> QueryParam "device_id" DeviceID
        :> SpotPutNoContent