import { Multiname } from '../abc/lazy/Multiname';
import { axCoerceString } from '../run/axCoerceString';
import { AXSecurityDomain } from '../run/AXSecurityDomain';

export function walk(sec: AXSecurityDomain, holder: any, name: string, reviver: Function) {
	const val = holder[name];
	if (Array.isArray(val)) {
		const v: any[] = <any>val;
		for (let i = 0, limit = v.length; i < limit; i++) {
			const newElement = walk(sec, v, axCoerceString(i), reviver);
			if (newElement === undefined) {
				delete v[i];
			} else {
				v[i] = newElement;
			}
		}
	} else if (val !== null && typeof val !== 'boolean' && typeof val !== 'number' &&
                typeof val !== 'string') {

		for (const p in val) {
			if (!val.hasOwnProperty(p) || !Multiname.isPublicQualifiedName(p)) {
				break;
			}
			const newElement = walk(sec, val, p, reviver);
			if (newElement === undefined) {
				delete val[p];
			} else {
				val[p] = newElement;
			}
		}
	}
	return reviver.call(holder, name, val);
}