{-# OPTIONS_HADDOCK hide, prune #-}

module Web.Pixiv.API.PixivEntry
  ( module Web.Pixiv.API.PixivEntry,
  )
where

import Data.Function ((&))
import Data.Proxy (Proxy (Proxy))
import Data.Text (Text)
import Servant.API (QueryParam, QueryParam', Required, Strict, type (:>))
import Servant.Client.Core (HasClient (..), addHeader, appendToQueryString)
import Web.Pixiv.Auth (Token (..))
import Web.Pixiv.Types (Publicity)

data PixivEntry

instance HasClient m api => HasClient m (PixivEntry :> api) where
  type Client m (PixivEntry :> api) = (Token, Maybe Text) -> Client m api
  clientWithRoute :: Proxy m
-> Proxy (PixivEntry :> api)
-> Request
-> Client m (PixivEntry :> api)
clientWithRoute Proxy m
pm Proxy (PixivEntry :> api)
Proxy Request
req = \(Token -> Text
unToken -> Text
token, Maybe Text
mLanguage) ->
    Proxy m -> Proxy api -> Request -> Client m api
forall (m :: Type -> Type) api.
HasClient m api =>
Proxy m -> Proxy api -> Request -> Client m api
clientWithRoute Proxy m
pm (Proxy api
forall k (t :: k). Proxy t
Proxy @api) (Request -> Client m api) -> Request -> Client m api
forall a b. (a -> b) -> a -> b
$
      Request
req
        Request -> (Request -> Request) -> Request
forall a b. a -> (a -> b) -> b
& HeaderName -> Text -> Request -> Request
forall a. ToHttpApiData a => HeaderName -> a -> Request -> Request
addHeader @Text HeaderName
"User-Agent" Text
"PixivAndroidApp/5.0.175 (Android 6.0; PixivHaskell)"
        Request -> (Request -> Request) -> Request
forall a b. a -> (a -> b) -> b
& HeaderName -> Text -> Request -> Request
forall a. ToHttpApiData a => HeaderName -> a -> Request -> Request
addHeader @Text HeaderName
"Authorization" (Text
"Bearer " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
token)
        Request -> (Request -> Request) -> Request
forall a b. a -> (a -> b) -> b
& Text -> Maybe Text -> Request -> Request
appendToQueryString Text
"filter" (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"for_android")
        Request -> (Request -> Request) -> Request
forall a b. a -> (a -> b) -> b
& (Request -> Request)
-> (Text -> Request -> Request) -> Maybe Text -> Request -> Request
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Request -> Request
forall a. a -> a
id (HeaderName -> Text -> Request -> Request
forall a. ToHttpApiData a => HeaderName -> a -> Request -> Request
addHeader @Text HeaderName
"Accept-Language") Maybe Text
mLanguage
  hoistClientMonad :: Proxy m
-> Proxy (PixivEntry :> api)
-> (forall x. mon x -> mon' x)
-> Client mon (PixivEntry :> api)
-> Client mon' (PixivEntry :> api)
hoistClientMonad Proxy m
pm Proxy (PixivEntry :> api)
Proxy forall x. mon x -> mon' x
f Client mon (PixivEntry :> api)
m (Token, Maybe Text)
p =
    Proxy m
-> Proxy api
-> (forall x. mon x -> mon' x)
-> Client mon api
-> Client mon' api
forall (m :: Type -> Type) api (mon :: Type -> Type)
       (mon' :: Type -> Type).
HasClient m api =>
Proxy m
-> Proxy api
-> (forall x. mon x -> mon' x)
-> Client mon api
-> Client mon' api
hoistClientMonad Proxy m
pm (Proxy api
forall k (t :: k). Proxy t
Proxy @api) forall x. mon x -> mon' x
f (Client mon (PixivEntry :> api)
(Token, Maybe Text) -> Client mon api
m (Token, Maybe Text)
p)

type OffsetParam = QueryParam "offset" Int

pageToOffset :: Int -> Int -> Maybe Int
pageToOffset :: Int -> Int -> Maybe Int
pageToOffset Int
perPage Int
x
  | Int
x Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1 = Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Maybe Int) -> Int -> Maybe Int
forall a b. (a -> b) -> a -> b
$ (Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
perPage
  | Bool
otherwise = Maybe Int
forall a. Maybe a
Nothing

type RestrictParam = QueryParam' '[Strict, Required] "restrict" Publicity