import apiClient from './client'
import type {
  LabelCreate,
  LabelResponse,
  LabelTreeResponse,
  LabelUpdate,
  MessageBulkLabelRequest,
  MessageBulkLabelResponse,
  MessageLabelAddRequest,
  MessageLabelRemoveRequest,
  MessageLabelSetRequest,
} from '@/types/api.types'

export const labelsApi = {
  // ─── CRUD Tag ─────────────────────────────────────────────────────────────

  list: () =>
    apiClient.get<LabelResponse[]>('/labels').then((r) => r.data),

  /** Restituisce la tassonomia come albero annidato (Ambito > Processo > Classificazione). */
  getTree: () =>
    apiClient.get<LabelTreeResponse[]>('/labels/tree').then((r) => r.data),

  create: (data: LabelCreate) =>
    apiClient.post<LabelResponse>('/labels', data).then((r) => r.data),

  update: (id: string, data: LabelUpdate) =>
    apiClient.patch<LabelResponse>(`/labels/${id}`, data).then((r) => r.data),

  delete: (id: string) =>
    apiClient.delete(`/labels/${id}`).then((r) => r.data),

  // ─── Tag su singolo messaggio ─────────────────────────────────────────────

  getMessageLabels: (messageId: string) =>
    apiClient
      .get<LabelResponse[]>(`/messages/${messageId}/labels`)
      .then((r) => r.data),

  /** Sostituisce tutti i tag di un messaggio. */
  setMessageLabels: (messageId: string, data: MessageLabelSetRequest) =>
    apiClient
      .put<LabelResponse[]>(`/messages/${messageId}/labels`, data)
      .then((r) => r.data),

  /** Aggiunge tag a un messaggio senza rimuovere quelli esistenti. */
  addMessageLabels: (messageId: string, data: MessageLabelAddRequest) =>
    apiClient
      .post<LabelResponse[]>(`/messages/${messageId}/labels/add`, data)
      .then((r) => r.data),

  /** Rimuove specifici tag da un messaggio. */
  removeMessageLabels: (messageId: string, data: MessageLabelRemoveRequest) =>
    apiClient
      .post<LabelResponse[]>(`/messages/${messageId}/labels/remove`, data)
      .then((r) => r.data),

  // ─── Bulk ─────────────────────────────────────────────────────────────────

  bulkLabels: (data: MessageBulkLabelRequest) =>
    apiClient
      .post<MessageBulkLabelResponse>('/messages/bulk-labels', data)
      .then((r) => r.data),
}
