import { booruConfig } from "@config/booru";

function timestampToReadable(timestamp?: number): string {
	const date: Date =
		timestamp && !isNaN(timestamp) ? new Date(timestamp) : new Date();
	if (isNaN(date.getTime())) return "Invalid Date";
	return date.toISOString().replace("T", " ").replace("Z", "");
}

function tagsToExpectedFormat(
	tags: string[] | string | Record<string, string[]>,
	minus: boolean = false,
	onlyMinus: boolean = false,
): string {
	const delimiter: string = minus ? (onlyMinus ? "-" : "+-") : "+";

	if (!tags) return "";

	const processTag: (tag: string) => string | null = (tag: string) => {
		const trimmed: string | null = tag.trim();
		return trimmed ? trimmed : null;
	};

	if (typeof tags === "string") {
		return tags
			.split(/\s+|,/)
			.map(processTag)
			.filter((tag: string | null): tag is string => Boolean(tag))
			.join(delimiter);
	}

	if (Array.isArray(tags)) {
		return tags
			.map(processTag)
			.filter((tag: string | null): tag is string => Boolean(tag))
			.join(delimiter);
	}

	const allTags: string[] = Object.values(tags).flat();
	return allTags
		.map(processTag)
		.filter((tag: string | null): tag is string => Boolean(tag))
		.join(delimiter);
}

function determineBooru(
	booruName: string,
): IBooruConfigMap[keyof IBooruConfigMap] | null {
	const booru: IBooruConfigMap[keyof IBooruConfigMap] | undefined =
		Object.values(booruConfig).find(
			(booru: IBooruConfigMap[keyof IBooruConfigMap]) =>
				booru.name === booruName ||
				booru.aliases.includes(booruName.toLowerCase()),
		);

	return booru || null;
}

export { determineBooru, tagsToExpectedFormat, timestampToReadable };