// import chardet from "chardet";
// import iconv from "iconv-lite";
import { GridFSBucketReadStream } from "mongodb";
import { stripHtml } from "string-strip-html";
import { IStory } from "@models/stories";
import { ficsHidden } from "@server/ficmas";
import { PreMiddlewareFunction, Query } from "mongoose";
import { IFicmas } from "@models/challenges/ficmas";

// const { encode, decode } = iconv;

export function countWords(string: string) {
	return stripHtml(string).result.split(/W+/).length;
}

export function populate<T>(field: string, model: string): PreMiddlewareFunction<Query<T, T>> {
	return function (next: () => any) {
		this.populate(field, undefined, model);
		next();
	};
}
export function populateSelected<T>(field: string, model: string, selection: string): PreMiddlewareFunction<Query<T, T>> {
	return function (next: () => any) {
		this.populate(field, selection, model);
		next();
	};
}

export function isFicmasHidden(story: IStory): boolean {
	return (
		((story.ficmas as IFicmas)?.year == new Date().getFullYear() &&
			(story.ficmas as IFicmas)?.anniversary &&
			new Date() < new Date(Date.parse("Aug 1 " + new Date().getFullYear()))) ||
		((story.ficmas as IFicmas)?.year == new Date().getFullYear() && !(story.ficmas as IFicmas)?.anniversary && ficsHidden(Date.now()))
	);
}

export function bufferizeStream(stream: GridFSBucketReadStream): Promise<Buffer> {
	let chunks: Buffer[] = [];

	return new Promise((res, rej) => {
		stream.on("data", (c) => chunks.push(Buffer.from(c)));
		stream.on("error", (err) => {
			rej(err);
		});
		stream.on("end", () => res(Buffer.concat(chunks)));
	});
}

export async function stringifyStream(stream: GridFSBucketReadStream): Promise<string> {
	let str = await bufferizeStream(stream);
	return str.toString("utf-8");
}

export function norm(text: string): string {
	return text
		.replace(/\n/g, "<br>")
		.replace(/<br><p>/gm, "<p>")
		.replace(/<p>&nbsp;<\/p>/gm, "")
		.replace(/<p><br\s\/><b\s\/><\/p>/gm, "");
}