/** 与政策追踪侧筛选文案保持一致 */
export const RESOURCE_FILTER_ALL_AREA = "全部领域";
export const RESOURCE_FILTER_ALL_TIME = "全部时间";
export const RESOURCE_FILTER_ALL_DEPT = "全部部门";

/**
 * 「全部」与具体项互斥；空选时回到「全部」
 * （同市场准入/政策追踪 resourceLibrary normalizeWithAll）
 */
export function normalizeExclusiveAllOption(val, allLabel) {
	if (!Array.isArray(val)) {
		return [allLabel];
	}
	if (val.includes(allLabel) && val.length > 1) {
		if (val[val.length - 1] === allLabel) {
			return [allLabel];
		}
		return val.filter((item) => item !== allLabel);
	}
	if (val.length === 0) {
		return [allLabel];
	}
	return val;
}

/** 发请求前去掉「全部领域」占位 */
export function stripAllAreaForRequest(arr) {
	return (Array.isArray(arr) ? arr : []).filter((id) => id !== RESOURCE_FILTER_ALL_AREA);
}

/** 发请求前去掉「全部时间」占位 */
export function stripAllTimeForRequest(arr) {
	return (Array.isArray(arr) ? arr : []).filter(
		(id) => id !== RESOURCE_FILTER_ALL_TIME && id !== "" && id != null
	);
}

/** 发请求前去掉「全部部门」占位 */
export function stripAllDeptForRequest(arr) {
	return (Array.isArray(arr) ? arr : []).filter((id) => id !== RESOURCE_FILTER_ALL_DEPT);
}

/**
 * 已选中的具体项是否覆盖选项全集（与仅选「全部领域/全部时间」等价：请求层不按子项狭义过滤）
 * @param {unknown[]} selectedStrippedIds 已去掉「全部」占位后的选中 id
 * @param {unknown[]} allOptionIds 当前列表全部可选项 id（与勾选框 label 一致）
 */
export function isSelectionCoveringAllOptions(selectedStrippedIds, allOptionIds) {
	if (!Array.isArray(selectedStrippedIds) || !Array.isArray(allOptionIds) || allOptionIds.length === 0) {
		return false;
	}
	if (selectedStrippedIds.length !== allOptionIds.length) {
		return false;
	}
	const setSel = new Set(selectedStrippedIds);
	return allOptionIds.every((id) => setSel.has(id));
}

/** 与政策追踪一致：勾选「更早」表示 2000～2020 自然年 */
export const RESOURCE_FILTER_EARLIER = "更早";
export const RESOURCE_YEAR_EARLIER_START = 2000;
export const RESOURCE_YEAR_EARLIER_END = 2020;

/** 展开「更早」为逐年数字（概览 report 接口 years 多为数字年） */
export function expandEarlierNumericYears() {
	const out = [];
	for (let y = RESOURCE_YEAR_EARLIER_START; y <= RESOURCE_YEAR_EARLIER_END; y += 1) {
		out.push(y);
	}
	return out;
}

/**
 * 概览资源库：去掉「全部时间」后的选中项 → years 查询串（含「更早」则展开为 2000…2020）
 */
export function buildNumericYearsQueryString(strippedTimeIds) {
	const list = Array.isArray(strippedTimeIds) ? strippedTimeIds : [];
	const yearsSet = new Set();
	for (const id of list) {
		if (id === RESOURCE_FILTER_EARLIER) {
			expandEarlierNumericYears().forEach((y) => yearsSet.add(y));
		} else if (id !== null && id !== undefined && id !== "") {
			const n = Number(id);
			if (!Number.isNaN(n)) {
				yearsSet.add(n);
			}
		}
	}
	return [...yearsSet].sort((a, b) => b - a).join(",");
}

const DYNAMICS_YEAR_LABEL_RE = /^(\d{4})年$/;

/**
 * 智库动态：时间为「2025年」等字符串 id → years 查询串（「更早」展开为 2000…2020）
 */
export function buildDynamicsYearsQueryString(strippedTimeIds) {
	const list = Array.isArray(strippedTimeIds) ? strippedTimeIds : [];
	const yearsSet = new Set();
	for (const id of list) {
		if (id === RESOURCE_FILTER_EARLIER) {
			expandEarlierNumericYears().forEach((y) => yearsSet.add(y));
			continue;
		}
		const m = String(id).match(DYNAMICS_YEAR_LABEL_RE);
		if (m) {
			yearsSet.add(Number(m[1]));
		}
	}
	return [...yearsSet].sort((a, b) => b - a).join(",");
}

/**
 * 中文日期串如「2020年5月1日」是否落在「更早」区间（与政策追踪矩形树一致）
 */
export function matchesEarlierChineseDate(timeStr) {
	const m = String(timeStr || "").match(/^(\d{4})年/);
	if (!m) {
		return false;
	}
	const y = Number(m[1]);
	return y >= RESOURCE_YEAR_EARLIER_START && y <= RESOURCE_YEAR_EARLIER_END;
}

/** 与政策追踪「仅全部时间」一致：固定起止（结束日按产品要求） */
export const RESOURCE_REPORT_ALL_TIME_START = "2000-01-01";

function getYesterdayYmd() {
	const d = new Date();
	// JS Date 自动处理跨月/跨年
	d.setDate(d.getDate() - 1);
	const y = d.getFullYear();
	const m = String(d.getMonth() + 1).padStart(2, "0");
	const day = String(d.getDate()).padStart(2, "0");
	return `${y}-${m}-${day}`;
}

export function getResourceReportAllTimeEndYmd() {
	return getYesterdayYmd();
}

function getResourceReportDateYearsAgo(years) {
	const currentDate = new Date();
	const pastDate = new Date(currentDate.getFullYear() - years, currentDate.getMonth(), currentDate.getDate());
	const y = pastDate.getFullYear();
	const month = String(pastDate.getMonth() + 1).padStart(2, "0");
	const day = String(pastDate.getDate()).padStart(2, "0");
	return `${y}-${month}-${day}`;
}

function getResourceReportTodayYmd() {
	const d = new Date();
	const y = d.getFullYear();
	const m = String(d.getMonth() + 1).padStart(2, "0");
	const day = String(d.getDate()).padStart(2, "0");
	return `${y}-${m}-${day}`;
}

/**
 * 资源库 /thinkTankOverview/report：由发布时间多选（数字年 +「更早」）推导 startDate/endDate，语义对齐政策追踪 getPolicyListDateRangeFromYearList。
 * - 仅「全部时间」或选满全部具体年份 → 2000-01-01 ~ 昨天
 * - 单选/多选自然年 +「更早」→ 取最小年 01-01 与最大年 12-31 包络（「更早」为 2000～2020）
 * - 无法解析时的兜底：近 relativeYearsAgo 年至今天
 *
 * @param {unknown[]} strippedTimeIds stripAllTimeForRequest 后的选中项
 * @param {unknown[]} allTimeOptionIds 当前 pubTimeList 全部 id（用于判断是否选满 = 全部时间）
 * @param {number} [relativeYearsAgo=1] 兜底用「近 N 年」
 * @returns {{ startDate: string, endDate: string }}
 */
export function getResourceLibraryReportDateRangeFromTimeSelection(
	strippedTimeIds,
	allTimeOptionIds,
	relativeYearsAgo = 1
) {
	const stripped = Array.isArray(strippedTimeIds) ? strippedTimeIds : [];
	const allIds = Array.isArray(allTimeOptionIds) ? allTimeOptionIds : [];

	const isAllTime =
		stripped.length === 0 ||
		(allIds.length > 0 && isSelectionCoveringAllOptions(stripped, allIds));

	if (isAllTime) {
		return {
			startDate: RESOURCE_REPORT_ALL_TIME_START,
			endDate: getResourceReportAllTimeEndYmd(),
		};
	}

	let minY = null;
	let maxY = null;
	const set = new Set(stripped);
	if (set.has(RESOURCE_FILTER_EARLIER)) {
		minY = RESOURCE_YEAR_EARLIER_START;
		maxY = RESOURCE_YEAR_EARLIER_END;
	}
	const yearLabelCnRe = /^(\d{4})年$/;
	for (const id of set) {
		if (id === RESOURCE_FILTER_EARLIER) {
			continue;
		}
		let yNum = Number(id);
		if (Number.isNaN(yNum)) {
			const m = String(id).match(yearLabelCnRe);
			if (m) {
				yNum = Number(m[1]);
			}
		}
		if (!Number.isNaN(yNum)) {
			minY = minY == null ? yNum : Math.min(minY, yNum);
			maxY = maxY == null ? yNum : Math.max(maxY, yNum);
		}
	}
	if (minY == null || maxY == null) {
		const y = Number(relativeYearsAgo) > 0 ? Number(relativeYearsAgo) : 1;
		return {
			startDate: getResourceReportDateYearsAgo(y),
			endDate: getResourceReportTodayYmd(),
		};
	}
	return {
		startDate: `${minY}-01-01`,
		endDate: maxY === new Date().getFullYear() ? getYesterdayYmd() : `${maxY}-12-31`,
	};
}
