import { createContext, useContext } from 'react'

export type ToastVariant = 'default' | 'success' | 'error'
export type ToastItem = { id: number; message: string; variant: ToastVariant }

export type ToastContextValue = {
  toasts: ToastItem[]
  dismiss: (id: number) => void
}

export const ToastContext = createContext<ToastContextValue | null>(null)

let pushImpl: ((message: string, variant: ToastVariant) => void) | null = null

/** Провайдер отдаёт сюда свою реализацию — через неё работает императивный {@link toast}. */
export function registerToastPush(push: (message: string, variant: ToastVariant) => void) {
  pushImpl = push
}

export function useToastContext() {
  const ctx = useContext(ToastContext)
  if (!ctx) throw new Error('useToastContext must be used within ToastProvider')
  return ctx
}

/** Императивный вызов из любого места (не только компонентов). */
export const toast = {
  success: (message: string) => pushImpl?.(message, 'success'),
  error: (message: string) => pushImpl?.(message, 'error'),
  message: (message: string) => pushImpl?.(message, 'default'),
}
