import fs from 'node:fs/promises';
import path from 'node:path';
import micromatch from 'micromatch';
import main from './main';

interface Stats {
	readonly modules: readonly {
		readonly id: string;
		readonly name: string;
		readonly reasons: readonly {
			readonly moduleName: string;
		}[];
	}[];
}

fs.readFile(
	path.resolve(__dirname, '../storybook-static/preview-stats.json')
).then((buffer) => {
	const stats: Stats = JSON.parse(buffer.toString());
	const keys = new Set(stats.modules.map((stat) => stat.id));
	const map = new Map(
		Array.from(keys, (key) => [
			key,
			new Set(
				stats.modules
					.filter((stat) => stat.id === key)
					.flatMap((stat) => stat.reasons)
					.map((reason) => reason.moduleName)
			),
		])
	);
	const modules = new Set(
		process.argv
			.slice(2)
			.map((arg) =>
				path.relative(
					path.resolve(__dirname, '..'),
					path.resolve(__dirname, '../../..', arg)
				)
			)
			.map((path) => path.replace(/(?:(?<=\.stories)\.(?:impl|meta)|\.msw)(?=\.ts$)/g, ''))
			.map((path) => (path.startsWith('.') ? path : `./${path}`))
	);
	if (
		micromatch(Array.from(modules), [
			'../../assets/**',
			'../../fluent-emojis/**',
			'../../locales/ja-JP.yml',
			'../../misskey-assets/**',
			'assets/**',
			'public/**',
			'../../pnpm-lock.yaml',
		]).length
	) {
		return;
	}
	for (;;) {
		const oldSize = modules.size;
		for (const module of Array.from(modules)) {
			if (map.has(module)) {
				for (const dependency of Array.from(map.get(module)!)) {
					modules.add(dependency);
				}
			}
		}
		if (modules.size === oldSize) {
			break;
		}
	}
	const stories = micromatch(
		Array.from(modules),
		main.stories.map((story) => `./${path.relative('..', story)}`)
	);
	if (stories.length) {
		for (const story of stories) {
			process.stdout.write(` --only-story-files ${story}`);
		}
	} else {
		process.stdout.write(` --skip`);
	}
});
