/**
 * REST 呼び出しの失敗から、利用者に見せる 1 行を取り出す。
 *
 * ⚠️ apiFetch に `parse: false` を指定した呼び出しは、失敗時に
 * **`Response` をそのまま throw** する。
 * `Error` ではないので `err.message` は必ず `undefined` になり、
 * `setNotice( { status: 'error', message: err.message } )` と書くと
 * **赤い枠だけで中身が空の通知**が出る。403 なのか 500 なのか通信断なのかが分からない。
 *
 * `parse: true`（既定）の失敗は `message` を持つのでそのまま使える。
 * 両方をここで吸収する。
 *
 * @param {unknown} err       REST 呼び出しが throw したもの
 * @param {string}  fallback  何も取り出せなかったときの文言
 * @return {Promise<string>} 表示用のメッセージ
 *
 * ⚠️ このファイルのコメントに `apiFetch` + 丸括弧の綴りを書かないこと。
 * 静的検査 M-4 は「その綴りを含むファイルは apiFetch を import しているか」を
 * 見ており、コメントを除外しないため、書くと NG に化ける。
 */
export async function apiErrorMessage( err, fallback ) {
	const fb = fallback || 'The request failed.';

	if ( err && typeof err === 'object' && typeof err.message === 'string' && err.message ) {
		return err.message;
	}

	// parse:false 指定の失敗（Response そのもの）。本文に WP の error JSON が入っていることが多い。
	if ( typeof Response !== 'undefined' && err instanceof Response ) {
		let detail = '';
		try {
			const body = await err.clone().json();
			if ( body && typeof body.message === 'string' ) {
				detail = body.message;
			}
		} catch ( e ) {
			detail = '';
		}
		if ( detail ) {
			return `${ detail } (HTTP ${ err.status })`;
		}
		return `${ fb } (HTTP ${ err.status } ${ err.statusText || '' })`.trim();
	}

	return fb;
}
