const isEmptyValue = (value) => value === null || value === undefined || value === '' || value === '-';

const toFiniteNumber = (value) => {
	if (isEmptyValue(value)) return null;

	const numericValue = Number(value);
	return Number.isFinite(numericValue) ? numericValue : null;
};

const clampScore = (value) => Math.min(Math.max(value, 0), 100);

export const getNetworkScore = (rsrp, rsrq, sinr) => {
	const rsrpValue = toFiniteNumber(rsrp);
	const rsrqValue = toFiniteNumber(rsrq);
	const sinrValue = toFiniteNumber(sinr);

	const metrics = [
		{ score: rsrpValue === null ? null : clampScore((rsrpValue + 120) * 2), weight: 0.5 },
		{ score: sinrValue === null ? null : clampScore(sinrValue * 5), weight: 0.3 },
		{ score: rsrqValue === null ? null : clampScore((rsrqValue + 20) * 5), weight: 0.2 }
	].filter(item => item.score !== null);

	if (!metrics.length) return null;

	const totalWeight = metrics.reduce((sum, item) => sum + item.weight, 0);
	return metrics.reduce((sum, item) => sum + item.score * item.weight, 0) / totalWeight;
};

export const getNetworkLevel = (score) => {
	if (score === null || score === undefined || !Number.isFinite(score)) return '-';
	if (score >= 85) return '极好';
	if (score >= 70) return '良好';
	if (score >= 50) return '一般';
	if (score >= 30) return '较差';
	return '很差';
};

export const getNetworkLevelByMetrics = (rsrp, rsrq, sinr) =>
	getNetworkLevel(getNetworkScore(rsrp, rsrq, sinr));
