{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module WikiMusic.SSR.View.ArtistHtml
  ( artistListPage',
    artistDetailPage',
    artistCreatePage',
    artistEditPage',
  )
where

import Data.Map qualified as Map
import Data.Text qualified as T
import Principium
import Text.Blaze.Html5 as H hiding (map)
import Text.Blaze.Html5.Attributes as A
import WikiMusic.Interaction.Model.Artist
import WikiMusic.SSR.View.Components.Forms
import WikiMusic.SSR.View.Components.Other
import WikiMusic.SSR.View.HtmlUtil

artistListPage' :: (MonadIO m) => Limit -> Offset -> Env -> ViewVars -> GetArtistsQueryResponse -> m Html
artistListPage' :: forall (m :: * -> *).
MonadIO m =>
Limit
-> Offset -> Env -> ViewVars -> GetArtistsQueryResponse -> m Html
artistListPage' Limit
limit Offset
offset Env
env ViewVars
vv GetArtistsQueryResponse
xs =
  Env -> ViewVars -> SimplePageTitle -> Html -> m Html
forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> SimplePageTitle -> Html -> m Html
simplePage Env
env ViewVars
vv (Text -> SimplePageTitle
SimplePageTitle (Text -> SimplePageTitle) -> Text -> SimplePageTitle
forall a b. (a -> b) -> a -> b
$ (ApplicationDictionary
-> Optic' A_Lens NoIx ApplicationDictionary DictTerm -> DictTerm
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic
  A_Lens
  NoIx
  ApplicationDictionary
  ApplicationDictionary
  Titles
  Titles
#titles Optic
  A_Lens
  NoIx
  ApplicationDictionary
  ApplicationDictionary
  Titles
  Titles
-> Optic A_Lens NoIx Titles Titles DictTerm DictTerm
-> Optic' A_Lens NoIx ApplicationDictionary DictTerm
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Lens NoIx Titles Titles DictTerm DictTerm
#artistsPage) (ApplicationDictionary -> DictTerm) -> Language -> Text
|##| (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars Language -> Language
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars Language
#language)) (Html -> m Html) -> Html -> m Html
forall a b. (a -> b) -> a -> b
$ do
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! [Text] -> Attribute
css' [Text
"flex", Text
"flex-row", Text
"flex-wrap", Text
"gap-4", Text
"justify-center", Text
"align-center", Text
"items-center"] (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
      Text -> Html -> Html
searchForm Text
"/artists/search" (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
        Text -> Html
searchInput Text
"searchInput"
        Html
submitButtonNoText

      Html -> Html
section (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
        Html -> Html
H.a (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! AttributeValue -> Attribute
href AttributeValue
"/artists/create" (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
button (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ Html -> Html
H.small Html
"+ new artist"
        ViewVars -> SortOrder -> Text -> Text -> Html
mkSortingForm ViewVars
vv (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars SortOrder -> SortOrder
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars SortOrder
#artistSorting) Text
"/user-preferences/artist-sorting" Text
"artist-sorting"
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! Set Text -> Attribute
css Set Text
cssCenteredCardGrid (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ (Artist -> Html) -> [Artist] -> Html
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (ViewVars -> Text -> Artist -> Html
forall {k1} {k2} {k3} {k4} {k5} {k6} {k7} {k8} {a1} {k9} {l1} {l2}
       {s1} {u} {v} {k10} {s2} {k11} {a2}.
(Is k1 A_Getter, Is k2 A_Getter, Is k3 A_Getter, Is k4 A_Getter,
 Is k5 A_Getter, Is k6 A_Getter, Is k7 A_Getter, Is k8 A_Getter,
 Show a1, JoinKinds k9 l1 k3, JoinKinds k9 l2 k2,
 LabelOptic "identifier" k4 s1 s1 UUID UUID,
 LabelOptic "displayName" k7 s1 s1 Text Text,
 LabelOptic "isLike" l1 u v Bool Bool,
 LabelOptic "artworks" k6 s1 s1 (Map k10 s2) (Map k10 s2),
 LabelOptic "opinions" k8 s1 s1 (Map k11 a2) (Map k11 a2),
 LabelOptic "viewCount" k1 s1 s1 a1 a1,
 LabelOptic "artwork" k5 s2 s2 Artwork Artwork,
 LabelOptic "opinion" k9 a2 a2 u v,
 LabelOptic "isDislike" l2 u v Bool Bool) =>
ViewVars -> Text -> s1 -> Html
simpleEntityCard ViewVars
vv Text
"artists") [Artist]
sortedXs
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! [Text] -> Attribute
css' [Text
"flex", Text
"flex-row", Text
"flex-wrap", Text
"gap-4", Text
"justify-center", Text
"align-center", Text
"items-center", Text
"my-6"] (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
      ViewVars -> Limit -> Offset -> Int -> Html
maybePrevPaginationButton ViewVars
vv Limit
limit Offset
offset (Map UUID Artist -> Int
forall a. Map UUID a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (GetArtistsQueryResponse
xs GetArtistsQueryResponse
-> Optic' A_Lens NoIx GetArtistsQueryResponse (Map UUID Artist)
-> Map UUID Artist
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetArtistsQueryResponse (Map UUID Artist)
#artists))
      ViewVars -> Limit -> Offset -> Int -> Html
maybeNextPaginationButton ViewVars
vv Limit
limit Offset
offset (Map UUID Artist -> Int
forall a. Map UUID a -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length (GetArtistsQueryResponse
xs GetArtistsQueryResponse
-> Optic' A_Lens NoIx GetArtistsQueryResponse (Map UUID Artist)
-> Map UUID Artist
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetArtistsQueryResponse (Map UUID Artist)
#artists))
  where
    sortedXs :: [Artist]
sortedXs =
      (UUID -> Maybe Artist) -> [UUID] -> [Artist]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe
        (\UUID
identifier -> (GetArtistsQueryResponse
xs GetArtistsQueryResponse
-> Optic' A_Lens NoIx GetArtistsQueryResponse (Map UUID Artist)
-> Map UUID Artist
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetArtistsQueryResponse (Map UUID Artist)
#artists) Map UUID Artist -> UUID -> Maybe Artist
forall k a. Ord k => Map k a -> k -> Maybe a
Principium.!? UUID
identifier)
        (GetArtistsQueryResponse
xs GetArtistsQueryResponse
-> Optic' A_Lens NoIx GetArtistsQueryResponse [UUID] -> [UUID]
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx GetArtistsQueryResponse [UUID]
#sortOrder)

artistDetailPage' :: (MonadIO m) => Env -> ViewVars -> Artist -> m Html
artistDetailPage' :: forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> Artist -> m Html
artistDetailPage' Env
env ViewVars
vv Artist
x = do
  Env -> ViewVars -> SimplePageTitle -> Html -> m Html
forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> SimplePageTitle -> Html -> m Html
simplePage Env
env ViewVars
vv (Text -> SimplePageTitle
SimplePageTitle (Text -> SimplePageTitle) -> Text -> SimplePageTitle
forall a b. (a -> b) -> a -> b
$ (ApplicationDictionary
-> Optic' A_Lens NoIx ApplicationDictionary DictTerm -> DictTerm
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic
  A_Lens
  NoIx
  ApplicationDictionary
  ApplicationDictionary
  Titles
  Titles
#titles Optic
  A_Lens
  NoIx
  ApplicationDictionary
  ApplicationDictionary
  Titles
  Titles
-> Optic A_Lens NoIx Titles Titles DictTerm DictTerm
-> Optic' A_Lens NoIx ApplicationDictionary DictTerm
forall k l m (is :: IxList) (js :: IxList) (ks :: IxList) s t u v a
       b.
(JoinKinds k l m, AppendIndices is js ks) =>
Optic k is s t u v -> Optic l js u v a b -> Optic m ks s t a b
% Optic A_Lens NoIx Titles Titles DictTerm DictTerm
#artistsPage) (ApplicationDictionary -> DictTerm) -> Language -> Text
|##| (ViewVars
vv ViewVars -> Optic' A_Lens NoIx ViewVars Language -> Language
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ViewVars Language
#language)) (Html -> m Html) -> Html -> m Html
forall a b. (a -> b) -> a -> b
$ do
    ViewVars -> Text -> Artist -> Html
forall {a1} {a2} {a3} {a4} {a5} {t1 :: * -> *} {k1} {l1} {k2} {l2}
       {k3} {k4} {k5} {k6} {k7} {k8} {k9} {k10} {k11} {k12} {k13} {k14}
       {k15} {k16} {k17} {t2 :: * -> *} {t3 :: * -> *} {t4 :: * -> *}
       {t5 :: * -> *} {t6 :: * -> *} {s} {u} {v} {k18} {a6} {k19} {a7}.
(Show a1, Show a2, Show a3, Show a4, Show a5, Functor t1,
 JoinKinds k1 l1 k2, JoinKinds k1 l2 k3, Is k4 A_Getter,
 Is k5 A_Getter, Is k6 A_Getter, Is k7 A_Getter, Is k8 A_Getter,
 Is k9 A_Getter, Is k10 A_Getter, Is k11 A_Getter, Is k3 A_Getter,
 Is k2 A_Getter, Is k12 A_Getter, Is k13 A_Getter, Is k14 A_Getter,
 Is k15 A_Getter, Is k16 A_Getter, Is k17 A_Getter, Foldable t2,
 Foldable t1, Foldable t3, Foldable t4, Foldable t5, Foldable t6,
 LabelOptic "description" k4 s s (t2 Text) (t2 Text),
 LabelOptic "identifier" k8 s s a1 a1,
 LabelOptic "createdBy" k9 s s a2 a2,
 LabelOptic "createdAt" k10 s s a3 a3,
 LabelOptic "lastEditedAt" k13 s s (t1 a5) (t1 a5),
 LabelOptic "displayName" k7 s s Text Text,
 LabelOptic "soundcloudUrl" k14 s s (t3 Text) (t3 Text),
 LabelOptic "spotifyUrl" k16 s s (t5 Text) (t5 Text),
 LabelOptic "wikipediaUrl" k15 s s (t4 Text) (t4 Text),
 LabelOptic "youtubeUrl" k17 s s (t6 Text) (t6 Text),
 LabelOptic "isLike" l2 u v Bool Bool,
 LabelOptic "artworks" k5 s s (Map k18 a6) (Map k18 a6),
 LabelOptic "opinions" k11 s s (Map k19 a7) (Map k19 a7),
 LabelOptic "viewCount" k12 s s a4 a4,
 LabelOptic "artwork" k6 a6 a6 Artwork Artwork,
 LabelOptic "opinion" k1 a7 a7 u v,
 LabelOptic "isDislike" l1 u v Bool Bool) =>
ViewVars -> Text -> s -> Html
entityDetails ViewVars
vv Text
"artists" Artist
x

artistCreatePage' :: (MonadIO m) => Env -> ViewVars -> m Html
artistCreatePage' :: forall (m :: * -> *). MonadIO m => Env -> ViewVars -> m Html
artistCreatePage' Env
env ViewVars
vv = do
  Env -> ViewVars -> SimplePageTitle -> Html -> m Html
forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> SimplePageTitle -> Html -> m Html
simplePage Env
env ViewVars
vv (Text -> SimplePageTitle
SimplePageTitle Text
"Create artist") (Html -> m Html) -> Html -> m Html
forall a b. (a -> b) -> a -> b
$ do
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! [Text] -> Attribute
css' [Text
"container", Text
"mx-auto"] (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
      Text -> Html -> Html
postForm Text
"/artists/create" (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
        Text -> Text -> Html
requiredTextInput Text
"displayName" Text
"artist name"
        Text -> Text -> Html
optionalTextArea Text
"description" Text
"description"
        Text -> Text -> Html
optionalTextInput Text
"spotifyUrl" Text
"spotify URL"
        Text -> Text -> Html
optionalTextInput Text
"youtubeUrl" Text
"youtube URL"
        Text -> Text -> Html
optionalTextInput Text
"wikipediaUrl" Text
"wikipedia URL"
        Text -> Text -> Html
optionalTextInput Text
"soundcloudUrl" Text
"soundcloud URL"
        ViewVars -> Html
submitButton ViewVars
vv

artistEditPage' :: (MonadIO m) => Env -> ViewVars -> Artist -> m Html
artistEditPage' :: forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> Artist -> m Html
artistEditPage' Env
env ViewVars
vv Artist
artist = do
  Env -> ViewVars -> SimplePageTitle -> Html -> m Html
forall (m :: * -> *).
MonadIO m =>
Env -> ViewVars -> SimplePageTitle -> Html -> m Html
simplePage Env
env ViewVars
vv (Text -> SimplePageTitle
SimplePageTitle Text
"Edit artist") (Html -> m Html) -> Html -> m Html
forall a b. (a -> b) -> a -> b
$ do
    Html -> Html
section (Html -> Html) -> Attribute -> Html -> Html
forall h. Attributable h => h -> Attribute -> h
! [Text] -> Attribute
css' [Text
"container", Text
"mx-auto"] (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
      Text -> Html -> Html
postForm (Text
"/artists/edit/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> (String -> Text
T.pack (String -> Text) -> (UUID -> String) -> UUID -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. UUID -> String
forall b a. (Show a, IsString b) => a -> b
show (UUID -> Text) -> UUID -> Text
forall a b. (a -> b) -> a -> b
$ Artist
artist Artist -> Optic' A_Lens NoIx Artist UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist UUID
#identifier)) (Html -> Html) -> Html -> Html
forall a b. (a -> b) -> a -> b
$ do
        Text -> Text -> Maybe Text -> Html
requiredTextInput' Text
"displayName" Text
"artist name" (Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> Text -> Maybe Text
forall a b. (a -> b) -> a -> b
$ Artist
artist Artist -> Optic' A_Lens NoIx Artist Text -> Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist Text
#displayName)
        Text -> Text -> Maybe Text -> Html
optionalTextArea' Text
"description" Text
"description" (Artist
artist Artist -> Optic' A_Lens NoIx Artist (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist (Maybe Text)
#description)
        Text -> Text -> Maybe Text -> Html
optionalTextInput' Text
"spotifyUrl" Text
"spotify URL" (Artist
artist Artist -> Optic' A_Lens NoIx Artist (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist (Maybe Text)
#spotifyUrl)
        Text -> Text -> Maybe Text -> Html
optionalTextInput' Text
"youtubeUrl" Text
"youtube URL" (Artist
artist Artist -> Optic' A_Lens NoIx Artist (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist (Maybe Text)
#youtubeUrl)
        Text -> Text -> Maybe Text -> Html
optionalTextInput' Text
"wikipediaUrl" Text
"wikipedia URL" (Artist
artist Artist -> Optic' A_Lens NoIx Artist (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist (Maybe Text)
#wikipediaUrl)
        Text -> Text -> Maybe Text -> Html
optionalTextInput' Text
"soundcloudUrl" Text
"soundcloud URL" (Artist
artist Artist -> Optic' A_Lens NoIx Artist (Maybe Text) -> Maybe Text
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist (Maybe Text)
#soundcloudUrl)
        ViewVars -> Html
submitButton ViewVars
vv

      ViewVars -> Text -> [Artwork] -> Html
entityArtworkForm ViewVars
vv Text
"artists" ((ArtistArtwork -> Artwork) -> [ArtistArtwork] -> [Artwork]
forall a b. (a -> b) -> [a] -> [b]
map (ArtistArtwork
-> Optic' A_Lens NoIx ArtistArtwork Artwork -> Artwork
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx ArtistArtwork Artwork
#artwork) ([ArtistArtwork] -> [Artwork])
-> (Map UUID ArtistArtwork -> [ArtistArtwork])
-> Map UUID ArtistArtwork
-> [Artwork]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map UUID ArtistArtwork -> [ArtistArtwork]
forall k a. Map k a -> [a]
Map.elems (Map UUID ArtistArtwork -> [Artwork])
-> Map UUID ArtistArtwork -> [Artwork]
forall a b. (a -> b) -> a -> b
$ Artist
artist Artist
-> Optic' A_Lens NoIx Artist (Map UUID ArtistArtwork)
-> Map UUID ArtistArtwork
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist (Map UUID ArtistArtwork)
#artworks)
      Html
hr
      ViewVars -> Text -> UUID -> Html
entityNewArtworkForm ViewVars
vv Text
"artists" (Artist
artist Artist -> Optic' A_Lens NoIx Artist UUID -> UUID
forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. Optic' A_Lens NoIx Artist UUID
#identifier)