export type DatatableParams = {
  page?: number | string;
  per_page?: number | string;
  search?: string;
  sort_by?: string;
  sort_dir?: 'asc' | 'desc' | string;
  // Arbitrary filters accepted
  [key: string]: any;
};

export type DatatableResponse<T> = {
  data: T[];
  meta: {
    current_page: number;
    per_page: number;
    total: number;
    last_page: number;
    from: number | null;
    to: number | null;
  };
  query: Record<string, any>;
  status: 'ok' | 'error';
};

export async function fetchDatatable<T = any>(url: string, params: DatatableParams = {}, init?: RequestInit): Promise<DatatableResponse<T>> {
  const searchParams = new URLSearchParams();
  Object.entries(params).forEach(([k, v]) => {
    if (v === undefined || v === null || v === '') return;
    if (Array.isArray(v)) {
      // Support multi-value by repeating the key
      v.filter(x => x !== null && x !== '').forEach(val => searchParams.append(k, String(val)));
    } else {
      searchParams.set(k, String(v));
    }
  });

  // Cache-busting to ensure we always get fresh data after create/update/delete
  searchParams.set('_ts', String(Date.now()));

  const qs = searchParams.toString();
  const fullUrl = qs ? `${url}?${qs}` : url;
  const res = await fetch(fullUrl, {
    headers: { Accept: 'application/json' },
    cache: 'no-store',
    ...init,
  });
  if (!res.ok) {
    throw new Error(`Failed to fetch datatable: ${res.status}`);
  }
  return res.json();
}
