require "amazing_print"
class Debug
  def self.trace(with_sql: false)
    if with_sql
      subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |event|
        payload = event.payload[:sql]
        next if payload.match?(/^(SELECT|SET|SHOW|BEGIN|COMMIT|ROLLBACK|RELEASE|SAVEPOINT)/)
        # next if payload.include?("audits")

        event.payload[:type_casted_binds].each_with_index do |bind, index|
          payload = payload.gsub("$#{index + 1}", "'#{bind}'")
        end
        puts "+ #{payload}"
      end
    end

    @raise_traces = []
    raise_trace = TracePoint.new(:raise) do |tp|
      @raise_traces << tp
      ap({
        path: tp.path,
        lineno: tp.lineno,
        event: tp.event,
        method_id: tp.method_id,
        raised_exception: tp.raised_exception
      })
    end
    raise_trace.enable

    yield

    raise_trace.disable
    ActiveSupport::Notifications.unsubscribe(subscriber) if with_sql
  end
end