'use client'

import { createContext, useContext, useState, useCallback, useMemo, type ReactNode } from 'react'

/**
 * @deprecated Use React Query's `useQueryClient.invalidateQueries()` instead.
 * This context is kept for backward compatibility during migration.
 *
 * Migration guide:
 * - Replace `const { triggerRefresh } = useNoteRefresh()` with `const { refreshNotes } = useRefresh()`
 * - Replace `triggerRefresh()` with `refreshNotes(notebookId)` or `refreshNotes(null)`
 * - Replace `triggerNotebooksRefresh()` with `refreshNotebooks()`
 *
 * @see {@link https://tanstack.com/query/latest/docs/react/reference/queryclient | React Query invalidateQueries}
 * @see lib/use-refresh.ts
 */
interface NoteRefreshContextType {
  refreshKey: number
  triggerRefresh: () => void
  notebooksRefreshKey: number
  triggerNotebooksRefresh: () => void
}

const NoteRefreshContext = createContext<NoteRefreshContextType | undefined>(undefined)

export function NoteRefreshProvider({ children }: { children: ReactNode }) {
  const [refreshKey, setRefreshKey] = useState(0)
  const [notebooksRefreshKey, setNotebooksRefreshKey] = useState(0)

  const triggerRefresh = useCallback(() => {
    setRefreshKey(prev => prev + 1)
  }, [])

  const triggerNotebooksRefresh = useCallback(() => {
    setNotebooksRefreshKey(prev => prev + 1)
  }, [])

  const value = useMemo(() => ({ refreshKey, triggerRefresh, notebooksRefreshKey, triggerNotebooksRefresh }), [refreshKey, triggerRefresh, notebooksRefreshKey, triggerNotebooksRefresh])

  return (
    <NoteRefreshContext.Provider value={value}>
      {children}
    </NoteRefreshContext.Provider>
  )
}

/**
 * @deprecated Use `useRefresh()` from `@/lib/use-refresh` instead.
 * This hook is kept for backward compatibility during migration.
 */
export function useNoteRefresh() {
  const context = useContext(NoteRefreshContext)
  if (!context) {
    throw new Error('useNoteRefresh must be used within NoteRefreshProvider')
  }
  return context
}

/**
 * @deprecated Use `useRefresh()` from `@/lib/use-refresh` instead.
 * This hook is kept for backward compatibility during migration.
 */
export function useNoteRefreshOptional(): NoteRefreshContextType {
  const context = useContext(NoteRefreshContext)
  return context ?? { refreshKey: 0, triggerRefresh: () => {}, notebooksRefreshKey: 0, triggerNotebooksRefresh: () => {} }
}
