module Routes.Inbox.Accept where

import Control.Concurrent (threadDelay)
import Control.Concurrent.Async qualified as Async
import Control.Logger.Simple qualified as Log
import DB
import Fedi qualified as Fedi

acceptRequest
  :: Fedi.UserDetails
  -> Fedi.Link
  -> Fedi.AnyActivity
  -> ((Int64 -> IO ()) -> IO a)
  -> IO ()
acceptRequest details actor activity operation = do
  _ <- liftIO $ Async.async do
    Log.logDebug "Waiting 1 second before accepting follow..."
    threadDelay 1000000 -- 1 second
    let
      callback =
        ( \(opid :: DB.Int64) -> do
            result <-
              Fedi.sendPost
                details
                (actor.unwrap <> "/inbox")
                ( Fedi.makeAccept
                    Fedi.MkAccept
                      { Fedi.acceptId =
                          Fedi.actorUrl details <> "/accepts/requests/" <> show opid
                      , Fedi.acceptingActorUrl = Fedi.Link $ Fedi.actorUrl details
                      , Fedi.acceptedActivity = activity
                      }
                )
            Log.logDebug (Fedi.pShow result)
        )
    do
      operation callback
  pure ()