// https://medium.com/@genildocs/advanced-javascript-promises-4-techniques-you-havent-seen-5242a0b1556e

// Traditional approach - fails completely if any promise rejects
async function fetchUserDataOld(userIds) {
  try {
    const users = await Promise.all(
      userIds.map(id => fetch(`/api/users/${id}`).then(r => r.json()))
    );
    return users;
  } catch (error) {
    // Lost all data if even one request fails
    throw new Error('Failed to fetch user data');
  }
}

// Advanced approach - handles partial failures gracefully
async function fetchUserDataAdvanced(userIds) {
  const results = await Promise.allSettled(
    userIds.map(async (id) => {
      const response = await fetch(`/api/users/${id}`);
      if (!response.ok) {
        throw new Error(`Failed to fetch user ${id}: ${response.status}`);
      }
      return { id, data: await response.json() };
    })
  );

  const successful = results
    .filter(result => result.status === 'fulfilled')
    .map(result => result.value);

  const failed = results
    .filter(result => result.status === 'rejected')
    .map((result, index) => ({
      id: userIds[index],
      error: result.reason.message
    }));

  return {
    successful,
    failed,
    totalRequested: userIds.length,
    successRate: (successful.length / userIds.length) * 100
  };
}

// Usage
const userIds = [1, 2, 3, 4, 5];
const result = await fetchUserDataAdvanced(userIds);

console.log(`Successfully loaded ${result.successful.length} users`);
console.log(`Failed to load ${result.failed.length} users`);
console.log(`Success rate: ${result.successRate.toFixed(1)}%`);

// Handle partial failures appropriately
if (result.failed.length > 0) {
  console.log('Failed requests:', result.failed);
  // Maybe retry failed requests or show partial data
}