import { eventsList } from "@budibase/core"
import { filter, union, has, map } from "lodash/fp"

const allEventsOfType = type => filter(e => e.endsWith(`:${type}`))(eventsList)

const hasRecord = has("record")

export const register = (app, logTimeElapsed, eventNamespaces = []) => {
  const onCompleteEvents =
    eventNamespaces.length === 0
      ? allEventsOfType("onComplete")
      : map(e => `${e}:onComplete`)(eventNamespaces)

  const onErrorEvents =
    eventNamespaces.length === 0
      ? allEventsOfType("onError")
      : map(e => `${e}:onError`)(eventNamespaces)

  for (let ev of union(onCompleteEvents)(onErrorEvents)) {
    app.subscribe(ev, (_, ctx) => {
      const info = hasRecord(ctx) ? ctx.record.type() : ""

      logTimeElapsed(ev, ctx.elapsed, info)
    })
  }
}