-- | This module defines the translation functions for update mutations.
module Hasura.Backends.MSSQL.FromIr.Update
  ( fromUpdate,
  )
where

import Hasura.Backends.MSSQL.FromIr
  ( FromIr,
    NameTemplate (TableTemplate),
    generateAlias,
  )
import Hasura.Backends.MSSQL.FromIr.Constants (tempTableNameUpdated)
import Hasura.Backends.MSSQL.FromIr.Expression (fromGBoolExp)
import Hasura.Backends.MSSQL.Instances.Types ()
import Hasura.Backends.MSSQL.Types.Internal as TSQL
import Hasura.Backends.MSSQL.Types.Update as TSQL (BackendUpdate (..), Update (..))
import Hasura.Prelude
import Hasura.RQL.IR qualified as IR
import Hasura.RQL.Types.Column qualified as IR
import Hasura.SQL.Backend

fromUpdate :: IR.AnnotatedUpdate 'MSSQL -> FromIr Update
fromUpdate (IR.AnnotatedUpdateG table (permFilter, whereClause) _ backendUpdate _ allColumns) = do
  tableAlias <- generateAlias (TableTemplate (tableName table))
  runReaderT
    ( do
        permissionsFilter <- fromGBoolExp permFilter
        whereExpression <- fromGBoolExp whereClause
        let columnNames = map IR.ciColumn allColumns
        pure
          Update
            { updateTable =
                Aliased
                  { aliasedAlias = tableAlias,
                    aliasedThing = table
                  },
              updateSet = updateOperations backendUpdate,
              updateOutput = Output Inserted (map OutputColumn columnNames),
              updateTempTable = TempTable tempTableNameUpdated columnNames,
              updateWhere = Where [permissionsFilter, whereExpression]
            }
    )
    (EntityAlias tableAlias)