import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { apiFetch } from '../lib/api';
import type { MediaAltStatus, MediaScanChunk, MediaScanResult, MediaScanStart } from '../lib/types';

interface AltTextUpdateArgs {
  attachment_id: number;
  alt_text: string;
}

interface AltTextUpdateResult {
  ok: boolean;
  alt?: string;
  status?: MediaAltStatus;
  reason?: string;
}

export function useMediaScan() {
  const qc = useQueryClient();

  // The last persisted scan, if any — loaded once on mount so a page
  // refresh doesn't lose results until the user explicitly rescans.
  const lastScan = useQuery({
    queryKey: ['media-scan'],
    queryFn: () => apiFetch<MediaScanResult>('/media-scan'),
  });

  // A scan runs as: one startScan() call (snapshots the attachment list,
  // returns its total), then repeated scanChunk() calls until one comes
  // back with done:true — see MediaAccessibility.tsx's runScan().
  const startScan = useMutation({
    mutationFn: (opts?: { signal?: AbortSignal }) =>
      apiFetch<MediaScanStart>('/media-scan/start', { method: 'POST', signal: opts?.signal }),
  });

  const scanChunk = useMutation({
    mutationFn: (opts?: { signal?: AbortSignal }) =>
      apiFetch<MediaScanChunk>('/media-scan/chunk', { method: 'POST', signal: opts?.signal }),
    onSuccess: (data) => {
      if (data.done) qc.setQueryData(['media-scan'], data);
    },
  });

  const applyAltText = useMutation({
    mutationFn: ({ attachment_id, alt_text }: AltTextUpdateArgs) =>
      apiFetch<AltTextUpdateResult>('/media-alt-text', {
        method: 'POST',
        body: JSON.stringify({ attachment_id, alt_text }),
      }),
  });

  return { lastScan, startScan, scanChunk, applyAltText };
}
