{- This file is part of Vervis.
 -
 - Written in 2016, 2019, 2022, 2023 by fr33domlover <fr33domlover@riseup.net>.
 -
 - ♡ Copying is an act of love. Please copy, reuse and share.
 -
 - The author(s) have dedicated all copyright and related and neighboring
 - rights to this software to the public domain worldwide. This software is
 - distributed without any warranty.
 -
 - You should have received a copy of the CC0 Public Domain Dedication along
 - with this software. If not, see
 - <http://creativecommons.org/publicdomain/zero/1.0/>.
 -}

module Vervis.Widget.Person
    ( personLinkW
    , personLinkFedW
    , followW
    , personNavW
    )
where

import Data.Foldable
import Database.Persist
import Network.HTTP.Types.Method
import Yesod.Core
import Yesod.Persist.Core

import Network.FedURI
import Yesod.Auth.Unverified
import Yesod.Hashids

import qualified Web.ActivityPub as AP

import Database.Persist.Local

import Vervis.Foundation
import Vervis.Model
import Vervis.Model.Ident
import Vervis.Settings
import Vervis.Widget

personLinkW :: Entity Person -> Actor -> Widget
personLinkW (Entity personID person) actor = do
    personHash <- encodeKeyHashid personID
    [whamlet|
        <a href=@{PersonR personHash}>
          #{actorName actor} ~#{username2text $ personUsername person}
    |]

personLinkFedW
    :: Either (Entity Person, Actor) (Instance, RemoteObject, RemoteActor)
    -> Widget
personLinkFedW (Left (ep, a)) = personLinkW ep a
personLinkFedW (Right (inztance, object, actor)) =
    [whamlet|
        <a href="#{renderObjURI uActor}">
          #{marker $ remoteActorType actor} #
          $maybe name <- remoteActorName actor
            #{name} @ #{renderAuthority $ instanceHost inztance}
          $nothing
            #{renderAuthority $ instanceHost inztance}#{localUriPath $ remoteObjectIdent object}
    |]
    where
    uActor = ObjURI (instanceHost inztance) (remoteObjectIdent object)
    marker = \case
        AP.ActorTypePerson -> '~'
        AP.ActorTypeRepo -> '^'
        AP.ActorTypeTicketTracker -> '='
        AP.ActorTypePatchTracker -> '+'
        AP.ActorTypeProject -> '$'
        AP.ActorTypeTeam -> '&'
        AP.ActorTypeOther _ -> '?'

followW :: Route App -> Route App -> FollowerSetId -> Widget
followW followRoute unfollowRoute fsid = do
    maybeUser <- maybeVerifiedAuth
    for_ maybeUser $ \ (Entity _ user) -> do
        mfollow <-
            handlerToWidget $ runDB $
                getBy $ UniqueFollow (personActor user) fsid
        case mfollow of
            Nothing -> buttonW POST "Follow" followRoute
            Just _ -> buttonW POST "Unfollow" unfollowRoute

personNavW :: Entity Person -> Widget
personNavW (Entity personID person) = do
    personHash <- encodeKeyHashid personID
    $(widgetFile "person/widget/nav")