{-# 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 :: forall (r :: EffectRow).
Member InteractionEff r =>
Sem r (Snowflake Interaction)
getInteractionID = (forall k s (is :: IxList) a.
Is k A_Getter =>
s -> Optic' k is s a -> a
^. forall a. IsLabel "id" a => a
#id) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (r :: EffectRow).
Member InteractionEff r =>
Sem r Interaction
getInteraction

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

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

getInteractionUser :: P.Member InteractionEff r => P.Sem r (Snowflake User)
getInteractionUser :: forall (r :: EffectRow).
Member InteractionEff r =>
Sem r (Snowflake User)
getInteractionUser = do
  Interaction
int <- forall (r :: EffectRow).
Member InteractionEff r =>
Sem r Interaction
getInteraction
  let uid :: Maybe (Snowflake User)
uid = Interaction
int forall k s (is :: IxList) a.
Is k An_AffineFold =>
s -> Optic' k is s a -> Maybe a
^? forall a. IsLabel "user" a => a
#user 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
% forall a b. Prism (Maybe a) (Maybe b) a b
_Just 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
% forall a. IsLabel "id" a => a
#id
      mid :: Maybe (Snowflake User)
mid = Interaction
int forall k s (is :: IxList) a.
Is k An_AffineFold =>
s -> Optic' k is s a -> Maybe a
^? forall a. IsLabel "member" a => a
#member 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
% forall a b. Prism (Maybe a) (Maybe b) a b
_Just 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
% forall a. IsLabel "id" a => a
#id
  forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust forall a b. (a -> b) -> a -> b
$ Maybe (Snowflake User)
uid forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe (Snowflake User)
mid