/**
 * Outils partagés par les scénarios Playwright.
 */

/**
 * Intercepte une réponse JSON de l'API et la modifie avant de la rendre à la page.
 *
 * Pourquoi ce helper plutôt que `route.fetch()` en ligne : si la page navigue
 * pendant que l'interception est en cours, Playwright libère l'objet réponse et
 * `res.json()` lève « Response has been disposed ». Le test échouait alors une
 * fois sur trois, sans rapport avec ce qu'il vérifiait — et un test instable
 * finit par être ignoré, ce qui est pire qu'un test absent.
 *
 * On sérialise donc le corps immédiatement, et on abandonne proprement
 * l'interception si la requête a été annulée entre-temps.
 *
 * @param {import('@playwright/test').Page} page
 * @param {string} pattern  motif d'URL Playwright
 * @param {(body: any) => any} mutate  reçoit le corps parsé ; le modifie en place ou en renvoie un nouveau
 * @param {(route: import('@playwright/test').Route) => boolean} [when]
 *        n'intercepte que si vrai (ex. limiter au GET et laisser passer le PATCH)
 */
export async function patchJson(page, pattern, mutate, when) {
  await page.route(pattern, async (route) => {
    if (when && !when(route)) {
      await route.continue().catch(() => {});
      return;
    }
    let payload;
    try {
      const response = await route.fetch();
      const body = await response.json();
      payload = JSON.stringify(mutate(body) ?? body);
    } catch {
      // Requête annulée (navigation) : on laisse Playwright suivre son cours.
      await route.continue().catch(() => {});
      return;
    }
    await route
      .fulfill({ status: 200, contentType: "application/json; charset=utf-8", body: payload })
      .catch(() => {});
  });
}
