/* simple alias C.npc.Robin => V.NPCName[V.NPCNameList.indexOf("Robin")]
 * `C.npc.Black Hawk` won't work however, use `C.npc["Great Wolf"]` instead
 * run this after V.NPCName exists */
function initCNPC() {
	C.npc = {};
	for (const name of setup.NPCNameList) {
		Object.defineProperty(C.npc, name, {
			get() {
				return V.NPCName[setup.NPCNameList.indexOf(name)];
			},
			set(val) {
				V.NPCName[setup.NPCNameList.indexOf(name)] = val;
			},
		});
	}
}
window.initCNPC = initCNPC;

function initCCrime() {
	C.crime = {};

	C.crime.max = 10000;
	C.crime.min = 0;
	C.crime.spree = 1000;

	for (const crime of Object.keys(setup.crimeNames)) {
		Object.defineProperty(C.crime, crime, {
			get() {
				return V.crime[crime].current;
			},
			set(val) {
				V.crime[crime].current = Math.clamp(val, C.crime.min, C.crime.max);
			},
		});
		Object.defineProperty(C.crime, crime + "History", {
			get() {
				return V.crime[crime].history;
			},
			set(val) {
				V.crime[crime].history = val;
			},
		});
		Object.defineProperty(C.crime, crime + "Daily", {
			get() {
				return V.crime[crime].daily;
			},
			set(val) {
				V.crime[crime].daily = val;
			},
		});
		Object.defineProperty(C.crime, crime + "Count", {
			get() {
				return V.crime[crime].count;
			},
			set(val) {
				V.crime[crime].count = val;
				if (V.crime[crime].count === 0 && V.crime[crime].current > 0) {
					V.crime[crime].count = 1;
				} else if (V.crime[crime].current === 0 && V.crime[crime].count > 0) {
					V.crime[crime].count = 0;
				}
			},
		});
		Object.defineProperty(C.crime, crime + "CountHistory", {
			get() {
				return V.crime[crime].countHistory;
			},
			set(val) {
				V.crime[crime].countHistory = val;
			},
		});
	}

	C.crime.getEvents = (type, desc = "default") => {
		return V.crime.events[desc] && V.crime.events[desc].filter(e => e.type === type); // (ES2020)
	};
	C.crime.clearEvents = (type = null, desc = null) => {
		if (type !== null) {
			Object.keys(V.crime.events).forEach(d => {
				V.crime.events[d] = V.crime.events[d].filter(e => e.type !== type);
				if (V.crime.events[d].length === 0) delete V.crime.events[d];
			});
		} else if (desc !== null) {
			delete V.crime.events[desc];
		} else {
			V.crime.events = {};
		}
	};
	C.crime.logEvent = (severity, type = "thievery", desc = "default", date = Time.date.timeStamp) => {
		if (!V.crime.events[desc]) V.crime.events[desc] = [];
		V.crime.events[desc].push({ date, severity, type });
	};
}
window.initCCrime = initCCrime; // Init function