-- | Description: PostgreSQL interpreters for the query for auth info by account ID
module Polysemy.Account.Db.Interpreter.AuthForAccount where

import Data.UUID (UUID)
import Polysemy.Db (DbError)
import Polysemy.Db (Query)
import Polysemy.Hasql (DbTable)
import Polysemy.Hasql (interpretQueryDd)
import Sqel (Uuid, prim, prod)

import Polysemy.Account.Data.AccountAuth (AccountAuth)
import Polysemy.Account.Data.AuthForAccount (AuthForAccount)
import Polysemy.Account.Db.Dd (accountAuth)

-- | Interpret @'Query' 'AuthForAccount'@ with [Polysemy.Hasql]("Polysemy.Hasql").
interpretQueryAuthForAccountDb ::
  Member (DbTable (Uuid (AccountAuth UUID)) !! DbError) r =>
  InterpreterFor (Query (AuthForAccount UUID) [Uuid (AccountAuth UUID)] !! DbError) r
interpretQueryAuthForAccountDb :: forall (r :: EffectRow).
Member (DbTable (Uuid (AccountAuth UUID)) !! DbError) r =>
InterpreterFor
  (Query (AuthForAccount UUID) [Uuid (AccountAuth UUID)] !! DbError)
  r
interpretQueryAuthForAccountDb =
  forall result (query :: DdK) (proj :: DdK) (table :: DdK)
       (r :: EffectRow).
(MkTableSchema proj, MkTableSchema table,
 CheckedProjection proj table, CheckQuery query table,
 ResultShape (DdType proj) result,
 Member (DbTable (DdType table) !! DbError) r) =>
Dd table
-> Dd proj
-> Dd query
-> InterpreterFor (Query (DdType query) result !! DbError) r
interpretQueryDd forall {i}.
Dd
  ('DdK
     'SelAuto
     '[]
     (Uid i (AccountAuth i))
     ('Comp
        ('TSel 'DefaultPrefix "AccountAuth")
        ('Prod 'Reg)
        'Nest
        '[ 'DdK ('SelSymbol "id") '[PrimaryKey] i 'Prim,
           'DdK
             'SelAuto
             '[]
             (AccountAuth i)
             ('Comp
                ('TSel 'DefaultPrefix "AccountAuth")
                ('Prod 'Reg)
                'Merge
                '[ 'DdK ('SelSymbol "account") '[] i 'Prim,
                   'DdK
                     ('SelSymbol "description")
                     '[Newtype AccountAuthDescription Text]
                     AccountAuthDescription
                     'Prim,
                   'DdK
                     ('SelSymbol "password")
                     '[Newtype HashedPassword Text]
                     HashedPassword
                     'Prim,
                   'DdK ('SelSymbol "expiry") '[Nullable] (Maybe Datetime) 'Prim])]))
table forall {i}.
Dd
  ('DdK
     'SelAuto
     '[]
     (Uid i (AccountAuth i))
     ('Comp
        ('TSel 'DefaultPrefix "AccountAuth")
        ('Prod 'Reg)
        'Nest
        '[ 'DdK ('SelSymbol "id") '[PrimaryKey] i 'Prim,
           'DdK
             'SelAuto
             '[]
             (AccountAuth i)
             ('Comp
                ('TSel 'DefaultPrefix "AccountAuth")
                ('Prod 'Reg)
                'Merge
                '[ 'DdK ('SelSymbol "account") '[] i 'Prim,
                   'DdK
                     ('SelSymbol "description")
                     '[Newtype AccountAuthDescription Text]
                     AccountAuthDescription
                     'Prim,
                   'DdK
                     ('SelSymbol "password")
                     '[Newtype HashedPassword Text]
                     HashedPassword
                     'Prim,
                   'DdK ('SelSymbol "expiry") '[Nullable] (Maybe Datetime) 'Prim])]))
table Dd
  ('DdK
     'SelAuto
     '[]
     (AuthForAccount UUID)
     ('Comp
        ('TSel 'DefaultPrefix "AuthForAccount")
        ('Prod 'Reg)
        'Nest
        '[ 'DdK ('SelSymbol "account") '[] UUID 'Prim]))
query
  where
    table :: Dd
  ('DdK
     'SelAuto
     '[]
     (Uid i (AccountAuth i))
     ('Comp
        ('TSel 'DefaultPrefix "AccountAuth")
        ('Prod 'Reg)
        'Nest
        '[ 'DdK ('SelSymbol "id") '[PrimaryKey] i 'Prim,
           'DdK
             'SelAuto
             '[]
             (AccountAuth i)
             ('Comp
                ('TSel 'DefaultPrefix "AccountAuth")
                ('Prod 'Reg)
                'Merge
                '[ 'DdK ('SelSymbol "account") '[] i 'Prim,
                   'DdK
                     ('SelSymbol "description")
                     '[Newtype AccountAuthDescription Text]
                     AccountAuthDescription
                     'Prim,
                   'DdK
                     ('SelSymbol "password")
                     '[Newtype HashedPassword Text]
                     HashedPassword
                     'Prim,
                   'DdK ('SelSymbol "expiry") '[Nullable] (Maybe Datetime) 'Prim])]))
table = forall {i}.
Dd
  ('DdK
     'SelAuto
     '[]
     (Uid i (AccountAuth i))
     ('Comp
        ('TSel 'DefaultPrefix "AccountAuth")
        ('Prod 'Reg)
        'Nest
        '[ 'DdK ('SelSymbol "id") '[PrimaryKey] i 'Prim,
           'DdK
             'SelAuto
             '[]
             (AccountAuth i)
             ('Comp
                ('TSel 'DefaultPrefix "AccountAuth")
                ('Prod 'Reg)
                'Merge
                '[ 'DdK ('SelSymbol "account") '[] i 'Prim,
                   'DdK
                     ('SelSymbol "description")
                     '[Newtype AccountAuthDescription Text]
                     AccountAuthDescription
                     'Prim,
                   'DdK
                     ('SelSymbol "password")
                     '[Newtype HashedPassword Text]
                     HashedPassword
                     'Prim,
                   'DdK ('SelSymbol "expiry") '[Nullable] (Maybe Datetime) 'Prim])]))
accountAuth
    query :: Dd
  ('DdK
     'SelAuto
     '[]
     (AuthForAccount UUID)
     ('Comp
        ('TSel 'DefaultPrefix "AuthForAccount")
        ('Prod 'Reg)
        'Nest
        '[ 'DdK ('SelSymbol "account") '[] UUID 'Prim]))
query = forall a arg (s :: DdK). Product a arg s => arg -> Dd s
prod forall a. Dd ('DdK 'SelAuto '[] a 'Prim)
prim