{-# LANGUAGE TemplateHaskell #-}

-- | Effect for working with an interaction
module Calamity.Interactions.Eff (
  InteractionEff (..),
  getInteraction,
  getInteractionID,
  getApplicationID,
  getInteractionToken,
  getInteractionUser,
) where

import Calamity.Types.Model.Interaction
import Calamity.Types.Model.User (User)
import Calamity.Types.Snowflake
import Control.Applicative ((<|>))
import Optics ((^.), (^?), _Just, (%))
import Data.Maybe (fromJust)
import Polysemy
import qualified Polysemy as P

data InteractionEff m a where
  GetInteraction :: InteractionEff m Interaction

makeSem ''InteractionEff

getInteractionID :: P.Member InteractionEff r => P.Sem r (Snowflake Interaction)
getInteractionID :: Sem r (Snowflake Interaction)
getInteractionID = (Interaction
-> Optic' A_Lens NoIx Interaction (Snowflake Interaction)
-> Snowflake Interaction
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
       (a :: OpticKind).
Is k A_Getter =>
s -> Optic' k is s a -> a
^. IsLabel
  "id" (Optic' A_Lens NoIx Interaction (Snowflake Interaction))
Optic' A_Lens NoIx Interaction (Snowflake Interaction)
#id) (Interaction -> Snowflake Interaction)
-> Sem r Interaction -> Sem r (Snowflake Interaction)
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem r Interaction
forall (r :: [Effect]).
MemberWithError InteractionEff r =>
Sem r Interaction
getInteraction

getApplicationID :: P.Member InteractionEff r => P.Sem r (Snowflake Application)
getApplicationID :: Sem r (Snowflake Application)
getApplicationID = (Interaction
-> Optic' A_Lens NoIx Interaction (Snowflake Application)
-> Snowflake Application
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
       (a :: OpticKind).
Is k A_Getter =>
s -> Optic' k is s a -> a
^. IsLabel
  "applicationID"
  (Optic' A_Lens NoIx Interaction (Snowflake Application))
Optic' A_Lens NoIx Interaction (Snowflake Application)
#applicationID) (Interaction -> Snowflake Application)
-> Sem r Interaction -> Sem r (Snowflake Application)
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem r Interaction
forall (r :: [Effect]).
MemberWithError InteractionEff r =>
Sem r Interaction
getInteraction

getInteractionToken :: P.Member InteractionEff r => P.Sem r InteractionToken
getInteractionToken :: Sem r InteractionToken
getInteractionToken = (Interaction
-> Optic' A_Lens NoIx Interaction InteractionToken
-> InteractionToken
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
       (a :: OpticKind).
Is k A_Getter =>
s -> Optic' k is s a -> a
^. IsLabel "token" (Optic' A_Lens NoIx Interaction InteractionToken)
Optic' A_Lens NoIx Interaction InteractionToken
#token) (Interaction -> InteractionToken)
-> Sem r Interaction -> Sem r InteractionToken
forall (f :: OpticKind -> OpticKind) (a :: OpticKind)
       (b :: OpticKind).
Functor f =>
(a -> b) -> f a -> f b
<$> Sem r Interaction
forall (r :: [Effect]).
MemberWithError InteractionEff r =>
Sem r Interaction
getInteraction

getInteractionUser :: P.Member InteractionEff r => P.Sem r (Snowflake User)
getInteractionUser :: Sem r (Snowflake User)
getInteractionUser = do
  Interaction
int <- Sem r Interaction
forall (r :: [Effect]).
MemberWithError InteractionEff r =>
Sem r Interaction
getInteraction
  let uid :: Maybe (Snowflake User)
uid = Interaction
int Interaction
-> Optic' An_AffineTraversal NoIx Interaction (Snowflake User)
-> Maybe (Snowflake User)
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
       (a :: OpticKind).
Is k An_AffineFold =>
s -> Optic' k is s a -> Maybe a
^? IsLabel
  "user"
  (Optic
     A_Lens NoIx Interaction Interaction (Maybe User) (Maybe User))
Optic A_Lens NoIx Interaction Interaction (Maybe User) (Maybe User)
#user Optic A_Lens NoIx Interaction Interaction (Maybe User) (Maybe User)
-> Optic A_Prism NoIx (Maybe User) (Maybe User) User User
-> Optic An_AffineTraversal NoIx Interaction Interaction User User
forall (k :: OpticKind) (l :: OpticKind) (m :: OpticKind)
       (is :: IxList) (js :: IxList) (ks :: IxList) (s :: OpticKind)
       (t :: OpticKind) (u :: OpticKind) (v :: OpticKind) (a :: OpticKind)
       (b :: OpticKind).
(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_Prism NoIx (Maybe User) (Maybe User) User User
forall (a :: OpticKind) (b :: OpticKind).
Prism (Maybe a) (Maybe b) a b
_Just Optic An_AffineTraversal NoIx Interaction Interaction User User
-> Optic A_Lens NoIx User User (Snowflake User) (Snowflake User)
-> Optic' An_AffineTraversal NoIx Interaction (Snowflake User)
forall (k :: OpticKind) (l :: OpticKind) (m :: OpticKind)
       (is :: IxList) (js :: IxList) (ks :: IxList) (s :: OpticKind)
       (t :: OpticKind) (u :: OpticKind) (v :: OpticKind) (a :: OpticKind)
       (b :: OpticKind).
(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
% IsLabel
  "id"
  (Optic A_Lens NoIx User User (Snowflake User) (Snowflake User))
Optic A_Lens NoIx User User (Snowflake User) (Snowflake User)
#id
      mid :: Maybe (Snowflake User)
mid = Interaction
int Interaction
-> Optic' An_AffineTraversal NoIx Interaction (Snowflake User)
-> Maybe (Snowflake User)
forall (k :: OpticKind) (s :: OpticKind) (is :: IxList)
       (a :: OpticKind).
Is k An_AffineFold =>
s -> Optic' k is s a -> Maybe a
^? IsLabel
  "member"
  (Optic
     A_Lens NoIx Interaction Interaction (Maybe Member) (Maybe Member))
Optic
  A_Lens NoIx Interaction Interaction (Maybe Member) (Maybe Member)
#member Optic
  A_Lens NoIx Interaction Interaction (Maybe Member) (Maybe Member)
-> Optic A_Prism NoIx (Maybe Member) (Maybe Member) Member Member
-> Optic
     An_AffineTraversal NoIx Interaction Interaction Member Member
forall (k :: OpticKind) (l :: OpticKind) (m :: OpticKind)
       (is :: IxList) (js :: IxList) (ks :: IxList) (s :: OpticKind)
       (t :: OpticKind) (u :: OpticKind) (v :: OpticKind) (a :: OpticKind)
       (b :: OpticKind).
(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_Prism NoIx (Maybe Member) (Maybe Member) Member Member
forall (a :: OpticKind) (b :: OpticKind).
Prism (Maybe a) (Maybe b) a b
_Just Optic An_AffineTraversal NoIx Interaction Interaction Member Member
-> Optic
     A_Lens NoIx Member Member (Snowflake User) (Snowflake User)
-> Optic' An_AffineTraversal NoIx Interaction (Snowflake User)
forall (k :: OpticKind) (l :: OpticKind) (m :: OpticKind)
       (is :: IxList) (js :: IxList) (ks :: IxList) (s :: OpticKind)
       (t :: OpticKind) (u :: OpticKind) (v :: OpticKind) (a :: OpticKind)
       (b :: OpticKind).
(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
% IsLabel
  "id"
  (Optic A_Lens NoIx Member Member (Snowflake User) (Snowflake User))
Optic A_Lens NoIx Member Member (Snowflake User) (Snowflake User)
#id
  Snowflake User -> Sem r (Snowflake User)
forall (f :: OpticKind -> OpticKind) (a :: OpticKind).
Applicative f =>
a -> f a
pure (Snowflake User -> Sem r (Snowflake User))
-> (Maybe (Snowflake User) -> Snowflake User)
-> Maybe (Snowflake User)
-> Sem r (Snowflake User)
forall (b :: OpticKind) (c :: OpticKind) (a :: OpticKind).
(b -> c) -> (a -> b) -> a -> c
. Maybe (Snowflake User) -> Snowflake User
forall (a :: OpticKind). HasCallStack => Maybe a -> a
fromJust (Maybe (Snowflake User) -> Sem r (Snowflake User))
-> Maybe (Snowflake User) -> Sem r (Snowflake User)
forall (a :: OpticKind) b. (a -> b) -> a -> b
$ Maybe (Snowflake User)
uid Maybe (Snowflake User)
-> Maybe (Snowflake User) -> Maybe (Snowflake User)
forall (f :: OpticKind -> OpticKind) (a :: OpticKind).
Alternative f =>
f a -> f a -> f a
<|> Maybe (Snowflake User)
mid