import { useCallback, useRef, useState } from 'react'
import type { FieldError } from '@platform-modules/forms'
import { FormsClientError, isFormsClientError } from './errors.js'
import type { SubmitFn, SubmitResult } from './seams.js'

function toError(e: unknown): FormsClientError {
  if (isFormsClientError(e)) return e
  if (e instanceof Error) return new FormsClientError(e.message)
  return new FormsClientError(String(e))
}

export function useFormSubmit(submit: SubmitFn) {
  const [pending, setPending] = useState(false)
  const [fieldErrors, setFieldErrors] = useState<FieldError[]>([])

  const submitRef = useRef(submit)
  submitRef.current = submit

  const submitFn = useCallback(
    async (formId: string, data: Record<string, unknown>, renderToken?: string): Promise<SubmitResult> => {
      setPending(true)
      try {
        const result = await submitRef.current(formId, data, renderToken)
        if (!result.ok) {
          setFieldErrors(result.errors)
        } else {
          setFieldErrors([])
        }
        return result
      } catch (e: unknown) {
        throw toError(e)
      } finally {
        setPending(false)
      }
    },
    [],
  )

  return { submit: submitFn, pending, fieldErrors }
}
