/**
 * 会員種別（料金区分）の表示名に学会の略称を前置する（JS 側）
 *
 * PHP 側の正典は includes/members/class-member-type-label.php。
 * 設定は wp_localize_script で `confManagerMemberType` として渡ってくる
 * （管理・公開の両バンドルへ渡す。REST から取ると「学会編集者」が 403 になる）。
 *
 * 🔴 設計の要点（外すと壊れる）
 *  1. 元のラベル定義は変えない。**表示の直前にだけ**通す
 *  2. 既定は「付けない」（設定が空なら何もしない）
 *  3. **前置してよいのは標準 5 区分だけ。判定はキーで行う。**
 *     ラベル文字列で判定すると、独自区分の名前がたまたま「正会員」のときに巻き込むうえ、
 *     **描画のたびに前置が伸びる**
 */

const DEFAULT_STANDARD_KEYS = [ 'regular', 'student', 'associate', 'honorary', 'general' ];

function settings() {
	const s = typeof window !== 'undefined' ? window.confManagerMemberType : null;
	return {
		shortName: ( s && typeof s.short_name === 'string' ) ? s.short_name.trim() : '',
		separator: ( s && typeof s.separator === 'string' && s.separator !== '' ) ? s.separator : '_',
		standardKeys: ( s && Array.isArray( s.standard_keys ) && s.standard_keys.length )
			? s.standard_keys
			: DEFAULT_STANDARD_KEYS,
	};
}

/**
 * 表示名に略称を前置する。
 *
 * @param {string} key   区分キー（regular / student / … 。独自区分もありうる）
 * @param {string} label 元の表示名
 * @return {string} 装飾後の表示名。設定が空、または標準 5 区分でなければ label のまま
 */
export function decorateMemberTypeLabel( key, label ) {
	const { shortName, separator, standardKeys } = settings();
	if ( ! shortName || ! label || ! standardKeys.includes( key ) ) {
		return label;
	}
	return shortName + separator + label;
}

/**
 * { key: label } をまとめて装飾する。
 *
 * @param {Object} labels
 * @return {Object}
 */
export function decorateMemberTypeLabels( labels ) {
	const out = {};
	Object.keys( labels || {} ).forEach( ( key ) => {
		out[ key ] = decorateMemberTypeLabel( key, labels[ key ] );
	} );
	return out;
}

/**
 * `[ { value, label } ]` の選択肢をまとめて装飾する。
 *
 * @param {Array} options
 * @return {Array}
 */
export function decorateMemberTypeOptions( options ) {
	return ( options || [] ).map( ( opt ) => ( {
		...opt,
		label: decorateMemberTypeLabel( opt.value, opt.label ),
	} ) );
}
