import fs from 'fs';
import path from 'path';
import { renderIconsObject } from '@lucide/build-icons';
import { readSvgDirectory, toCamelCase } from '@lucide/helpers';

const currentDir = process.cwd();
const ICONS_DIR = path.resolve(currentDir, '../icons');
const svgFiles = readSvgDirectory(ICONS_DIR);
const icons = renderIconsObject(svgFiles, ICONS_DIR, true);

const iconNodesDirectory = path.resolve(currentDir, '.vitepress/data', 'iconNodes');

if (fs.existsSync(iconNodesDirectory)) {
  fs.rmSync(iconNodesDirectory, { recursive: true, force: true });
}

if (!fs.existsSync(iconNodesDirectory)) {
  fs.mkdirSync(iconNodesDirectory);
}

const iconIndexFile = path.resolve(iconNodesDirectory, `index.ts`);
const iconIndexFileImports = [];
const iconIndexFileExports = [];
const iconIndexFileDefaultExports = [];

const writeIconFiles = Object.entries(icons).map(async ([iconName, { children }]) => {
  // We need to use .node.json because the there is a file called package, which is a reserved word for packages.
  const location = path.resolve(iconNodesDirectory, `${iconName}.node.json`);
  const iconNode = children.map(({ name, attributes }) => [name, attributes]);

  const output = JSON.stringify(iconNode, null, 2);
  await fs.promises.writeFile(location, output, 'utf-8');

  iconIndexFileImports.push(
    `import ${toCamelCase(iconName)}Node from './${iconName}.node.json' assert { type: "json" };`,
  );
  iconIndexFileExports.push(`  ${toCamelCase(iconName)}Node as ${toCamelCase(iconName)},`);
  iconIndexFileDefaultExports.push(`  '${iconName}': ${toCamelCase(iconName)}Node,`);
});

try {
  await Promise.all(writeIconFiles);
  await fs.promises.writeFile(
    iconIndexFile,
    `\
${iconIndexFileImports.join('\n')}

export {
${iconIndexFileExports.join('\n')}
}

export default {
${iconIndexFileDefaultExports.join('\n')}
}
  `,
    'utf-8',
  );

  console.log('Successfully write', writeIconFiles.length, 'iconNodes.');
} catch (error) {
  throw new Error(`Something went wrong generating iconNode files,\n ${error}`);
}
