function diffObject(before = {}, after = {}, parentPath = "") {
  const changes = [];

  const allKeys = new Set([
    ...Object.keys(before || {}),
    ...Object.keys(after || {}),
  ]);

  for (const key of allKeys) {
    const beforeValue = before?.[key];
    const afterValue = after?.[key];
    const currentPath = parentPath ? `${parentPath}.${key}` : key;

    // Nếu cả hai đều là object (không phải array)
    if (
      typeof beforeValue === "object" &&
      typeof afterValue === "object" &&
      beforeValue !== null &&
      afterValue !== null &&
      !Array.isArray(beforeValue) &&
      !Array.isArray(afterValue)
    ) {
      changes.push(...diffObject(beforeValue, afterValue, currentPath));
      continue;
    }

    // So sánh primitive hoặc array
    if (JSON.stringify(beforeValue) !== JSON.stringify(afterValue)) {
      changes.push({
        field: currentPath,
        before: beforeValue,
        after: afterValue,
      });
    }
  }

  return changes;
}

module.exports = diffObject;
