import apiClient from '@/lib/api-client';

export interface CrudClient<T, CreateInput, UpdateInput, RemoveResult = { ok: true }> {
  list(query?: string): Promise<{ items: T[] }>;
  create(input: CreateInput): Promise<T>;
  update(id: string, patch: UpdateInput): Promise<T>;
  remove(id: string): Promise<RemoveResult>;
}

export function createCrudClient<T, CreateInput, UpdateInput, RemoveResult = { ok: true }>(
  basePath: string,
): CrudClient<T, CreateInput, UpdateInput, RemoveResult> {
  return {
    list: (qs = '') =>
      apiClient.get(`${basePath}${qs}`) as unknown as Promise<{ items: T[] }>,
    create: (input) =>
      apiClient.post(basePath, input) as unknown as Promise<T>,
    update: (id, patch) =>
      apiClient.patch(`${basePath}/${id}`, patch) as unknown as Promise<T>,
    remove: (id) =>
      apiClient.delete(`${basePath}/${id}`) as unknown as Promise<RemoveResult>,
  };
}
