module Web.Exhentai.API.Watched
  ( fetchWatched,
    fetchPopular,
  )
where

import Control.Effect
import Control.Effect.Bracket
import Control.Effect.Error
import Control.Effect.Exh
import Data.Maybe
import Network.HTTP.Client hiding (Cookie)
import Optics.Core
import Web.Exhentai.API.Gallery
import Web.Exhentai.Parsing.Search
import Web.Exhentai.Utils

-- | Fetch the list of watched galleries
fetchWatched :: Effs '[Http, Error HttpException, Cookie, ConduitIO, Bracket] m => m [Gallery]
fetchWatched :: m [Gallery]
fetchWatched = do
  Document
d <- Text -> m Document
forall (m :: Type -> Type).
Effs '[Http, Error HttpException, ConduitIO, Cookie, Bracket] m =>
Text -> m Document
htmlRequest' Text
"https://exhentai.org/watched"
  [Gallery] -> m [Gallery]
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure ([Gallery] -> m [Gallery]) -> [Gallery] -> m [Gallery]
forall a b. (a -> b) -> a -> b
$ (Text -> Maybe Gallery) -> [Text] -> [Gallery]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Text -> Maybe Gallery
parseGalleryLink ([Text] -> [Gallery]) -> [Text] -> [Gallery]
forall a b. (a -> b) -> a -> b
$ Document
d Document
-> Optic A_Traversal '[] Element Element Text Text -> [Text]
forall l (is :: IxList) a.
(Is (Join A_Traversal l) A_Fold, Is l (Join A_Traversal l),
 Is A_Traversal (Join A_Traversal l)) =>
Document -> Optic l is Element Element a a -> [a]
^..: Traversal' Element Element
galleryPreviewElement Traversal' Element Element
-> Optic A_Traversal '[] Element Element Text Text
-> Optic A_Traversal '[] Element Element Text Text
forall k m l (ks :: IxList) (is :: IxList) (js :: IxList) s t u v a
       b.
(Is k m, Is l m, m ~ Join k l, ks ~ Append is js) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Traversal '[] Element Element Text Text
galleryLink
{-# INLINEABLE fetchWatched #-}

-- | Fetch the list of popular galleries
fetchPopular :: Effs '[Http, Error HttpException, Cookie, ConduitIO, Bracket] m => m [Gallery]
fetchPopular :: m [Gallery]
fetchPopular = do
  Document
d <- Text -> m Document
forall (m :: Type -> Type).
Effs '[Http, Error HttpException, ConduitIO, Cookie, Bracket] m =>
Text -> m Document
htmlRequest' Text
"https://exhentai.org/popular"
  [Gallery] -> m [Gallery]
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure ([Gallery] -> m [Gallery]) -> [Gallery] -> m [Gallery]
forall a b. (a -> b) -> a -> b
$ (Text -> Maybe Gallery) -> [Text] -> [Gallery]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe Text -> Maybe Gallery
parseGalleryLink ([Text] -> [Gallery]) -> [Text] -> [Gallery]
forall a b. (a -> b) -> a -> b
$ Document
d Document
-> Optic A_Traversal '[] Element Element Text Text -> [Text]
forall l (is :: IxList) a.
(Is (Join A_Traversal l) A_Fold, Is l (Join A_Traversal l),
 Is A_Traversal (Join A_Traversal l)) =>
Document -> Optic l is Element Element a a -> [a]
^..: Traversal' Element Element
galleryPreviewElement Traversal' Element Element
-> Optic A_Traversal '[] Element Element Text Text
-> Optic A_Traversal '[] Element Element Text Text
forall k m l (ks :: IxList) (is :: IxList) (js :: IxList) s t u v a
       b.
(Is k m, Is l m, m ~ Join k l, ks ~ Append is js) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Traversal '[] Element Element Text Text
galleryLink
{-# INLINEABLE fetchPopular #-}