import { useCallback } from 'react'
import { useDetachCompileContext as useCompileContext } from '../context/detach-compile-context'
import { useProjectContext } from '../context/project-context'
import * as eventTracking from '../../infrastructure/event-tracking'

type UseStopOnFirstErrorProps = {
  eventSource?: string
}

export function useStopOnFirstError(opts: UseStopOnFirstErrorProps = {}) {
  const { eventSource } = opts
  const { stopOnFirstError, setStopOnFirstError } = useCompileContext()
  const { _id: projectId } = useProjectContext()

  type Opts = {
    projectId: string
    source?: UseStopOnFirstErrorProps['eventSource']
  }

  const enableStopOnFirstError = useCallback(() => {
    if (!stopOnFirstError) {
      const opts: Opts = { projectId }
      if (eventSource) {
        opts.source = eventSource
      }
      eventTracking.sendMB('stop-on-first-error-enabled', opts)
    }
    setStopOnFirstError(true)
  }, [eventSource, projectId, stopOnFirstError, setStopOnFirstError])

  const disableStopOnFirstError = useCallback(() => {
    const opts: Opts = { projectId }
    if (eventSource) {
      opts.source = eventSource
    }
    if (stopOnFirstError) {
      eventTracking.sendMB('stop-on-first-error-disabled', opts)
    }
    setStopOnFirstError(false)
  }, [eventSource, projectId, stopOnFirstError, setStopOnFirstError])

  return { enableStopOnFirstError, disableStopOnFirstError }
}
