module Hasura.RQL.DDL.Schema.Common where

import Hasura.Base.Error
import Hasura.Prelude
import Hasura.RQL.DDL.ComputedField
import Hasura.RQL.DDL.EventTrigger
import Hasura.RQL.DDL.Permission
import Hasura.RQL.DDL.Relationship
import Hasura.RQL.DDL.RemoteRelationship
import Hasura.RQL.DDL.Schema.Function
import Hasura.RQL.Types
import Hasura.SQL.AnyBackend qualified as AB

purgeDependentObject ::
  forall b m.
  (MonadError QErr m, BackendMetadata b) =>
  SourceName ->
  SourceObjId b ->
  m MetadataModifier
purgeDependentObject source sourceObjId = case sourceObjId of
  SOITableObj tn tableObj ->
    pure $
      MetadataModifier $
        tableMetadataSetter @b source tn %~ case tableObj of
          TOPerm rn pt -> dropPermissionInMetadata rn pt
          TORel rn -> dropRelationshipInMetadata rn
          TOTrigger trn -> dropEventTriggerInMetadata trn
          TOComputedField ccn -> dropComputedFieldInMetadata ccn
          TORemoteRel rrn -> dropRemoteRelationshipInMetadata rrn
          _ -> id
  SOIFunction qf -> pure $ dropFunctionInMetadata @b source qf
  _ ->
    throw500 $
      "unexpected dependent object: "
        <> reportSchemaObj (SOSourceObj source $ AB.mkAnyBackend sourceObjId)
