import { useInfiniteQuery } from '@tanstack/react-query';
import { z } from 'zod';
import { apiFetch } from '../services/apiClient';

const PAGE_SIZE = 20;

const WordSchema = z.object({
  id: z.string().uuid(),
  text: z.string().min(1).max(255),
  createdAt: z.string().datetime(),
  status: z.enum(['active', 'to_be_defined']),
});

const PagedResponseSchema = z.object({
  data: z.array(WordSchema),
  total: z.number(),
  page: z.number(),
  limit: z.number(),
});

export type RecentWord = z.infer<typeof WordSchema>;

async function fetchRecentPage(page: number) {
  const response = await apiFetch(`/words?page=${page}&limit=${PAGE_SIZE}`);
  if (!response.ok) throw new Error(`HTTP error ${response.status}`);
  const raw: unknown = await response.json();
  return PagedResponseSchema.parse(raw);
}

/**
 * Loads all words ordered by most recent, page by page.
 * Uses useInfiniteQuery for automatic infinite scroll support.
 */
export function useRecentWords() {
  return useInfiniteQuery({
    queryKey: ['words', 'recent'],
    queryFn: ({ pageParam }) => fetchRecentPage(pageParam as number),
    initialPageParam: 1,
    getNextPageParam: (lastPage) => {
      const totalPages = Math.ceil(lastPage.total / lastPage.limit);
      return lastPage.page < totalPages ? lastPage.page + 1 : undefined;
    },
  });
}
