export interface PaginationMeta {
  current_page: number;
  last_page: number;
  per_page: number;
  total: number;
}

export interface PaginatedResponse<T> {
  data: T[];
  meta: PaginationMeta;
  links?: {
    first?: string | null;
    last?: string | null;
    prev?: string | null;
    next?: string | null;
  };
}

export function isPaginatedResponse<T>(
  value: unknown,
  itemGuard: (item: unknown) => item is T,
): value is PaginatedResponse<T> {
  if (typeof value !== 'object' || value === null) {
    return false;
  }

  const record = value as Record<string, unknown>;
  if (!Array.isArray(record.data) || !record.data.every(itemGuard)) {
    return false;
  }

  const meta = record.meta;
  if (typeof meta !== 'object' || meta === null) {
    return false;
  }

  const metaRecord = meta as Record<string, unknown>;

  return (
    typeof metaRecord.current_page === 'number' &&
    typeof metaRecord.last_page === 'number' &&
    typeof metaRecord.per_page === 'number' &&
    typeof metaRecord.total === 'number'
  );
}
