/**
 * Минимальная toast-система — собственная, без зависимостей (react-hot-toast
 * не хотим тянуть ради одного пункта). Subscribe/publish, autoclose через
 * 5 секунд, position top-right.
 *
 * Использование:
 *   import { toast } from '@/lib/toast'
 *   toast.success('Сохранено')
 *   toast.error('Не удалось сохранить — проверьте поля')
 *
 * Рендер: <Toaster /> в App.tsx один раз.
 */

export type ToastKind = 'success' | 'error' | 'info'
export interface ToastEntry {
  id: number
  kind: ToastKind
  message: string
  /** опционально — заголовок жирным сверху */
  title?: string
  /** опционально — миллисекунды до автозакрытия; 0 = не закрывать */
  duration: number
}

type Listener = (toasts: ToastEntry[]) => void

let counter = 1
let entries: ToastEntry[] = []
const listeners = new Set<Listener>()

function emit() {
  for (const l of listeners) l(entries.slice())
}

export function subscribeToasts(l: Listener): () => void {
  listeners.add(l)
  l(entries.slice())
  return () => { listeners.delete(l) }
}

function add(kind: ToastKind, message: string, opts?: { title?: string; duration?: number }) {
  const id = counter++
  const duration = opts?.duration ?? 5000
  // Дедуп: подряд идущие одинаковые сообщения не плодим.
  const last = entries[entries.length - 1]
  if (last && last.kind === kind && last.message === message && last.title === opts?.title) {
    return last.id
  }
  entries = [...entries, { id, kind, message, title: opts?.title, duration }]
  emit()
  if (duration > 0) {
    setTimeout(() => dismiss(id), duration)
  }
  return id
}

export function dismiss(id: number) {
  entries = entries.filter(e => e.id !== id)
  emit()
}

export const toast = {
  success: (message: string, opts?: { title?: string; duration?: number }) =>
    add('success', message, opts),
  error: (message: string, opts?: { title?: string; duration?: number }) =>
    add('error', message, opts),
  info: (message: string, opts?: { title?: string; duration?: number }) =>
    add('info', message, opts),
  dismiss,
}
