import { useMutation, useQueryClient } from '@tanstack/react-query';
import type { AssistantAsk, SuggestBilan } from '@siop/shared';
import { api } from './client';

/** Hooks R5 — l'assistant passe par l'API NestJS (le service IA n'est jamais
 *  appelé du navigateur, ADR-004 §4). Le 503 est un état ATTENDU du contrat
 *  (service éteint ou pas encore déployé) : les écrans l'affichent posément. */

async function unwrap<T>(res: { data?: T; error?: unknown; response: Response }): Promise<T> {
  if (res.response.status === 503) {
    throw new Error('Assistant indisponible pour le moment — réessayez dans un instant.');
  }
  if (res.error || res.data === undefined) {
    const message =
      (res.error as { message?: string } | undefined)?.message ??
      `Le serveur a répondu ${res.response.status}`;
    throw new Error(Array.isArray(message) ? message.join(' — ') : message);
  }
  return res.data;
}

export function useAskAssistant() {
  return useMutation({
    mutationFn: async (body: AssistantAsk) =>
      unwrap(await api.POST('/assistant/ask', { body })),
  });
}

export function useSuggestBilan() {
  return useMutation({
    mutationFn: async (body: SuggestBilan) =>
      unwrap(await api.POST('/assistant/suggest-bilan', { body })),
  });
}

export function useReindexAssistant() {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: async () => unwrap(await api.POST('/assistant/reindex')),
    // la réindexation met à jour indexedAt/chunkCount de chaque document
    onSuccess: () => queryClient.invalidateQueries({ queryKey: ['documents'] }),
  });
}

export function useSetDocumentCorpus() {
  const queryClient = useQueryClient();
  return useMutation({
    mutationFn: async (input: { id: string; inCorpus: boolean }) =>
      unwrap(
        await api.PATCH('/documents/{id}/corpus', {
          params: { path: { id: input.id } },
          body: { inCorpus: input.inCorpus },
        }),
      ),
    onSuccess: () => queryClient.invalidateQueries({ queryKey: ['documents'] }),
  });
}
