import type { UnistNode, UnistTree } from '@/types/unist';

import { visit } from 'unist-util-visit';

export function rehypeNpmCommand() {
  return (tree: UnistTree) => {
    visit(tree as any, (node: UnistNode) => {
      if (node.type !== 'element' || node?.tagName !== 'pre') {
        return;
      }
      // npm install.
      if (node.properties?.__rawString__?.startsWith('npm install')) {
        const npmCommand = node.properties?.__rawString__;
        node.properties.__npmCommand__ = npmCommand;
        node.properties.__yarnCommand__ = npmCommand.replace(
          'npm install',
          'yarn add'
        );
        node.properties.__pnpmCommand__ = npmCommand.replace(
          'npm install',
          'pnpm add'
        );
        node.properties.__bunCommand__ = npmCommand.replace(
          'npm install',
          'bun add'
        );
      }
      // npx create.
      if (node.properties?.__rawString__?.startsWith('npx create-')) {
        const npmCommand = node.properties?.__rawString__;
        node.properties.__npmCommand__ = npmCommand;
        node.properties.__yarnCommand__ = npmCommand.replace(
          'npx create-',
          'yarn create '
        );
        node.properties.__pnpmCommand__ = npmCommand.replace(
          'npx create-',
          'pnpm create '
        );
        node.properties.__bunCommand__ = npmCommand.replace(
          'npx',
          'bunx --bun'
        );
      }
      // npx.
      if (
        node.properties?.__rawString__?.startsWith('npx') &&
        !node.properties?.__rawString__?.startsWith('npx create-')
      ) {
        const npmCommand = node.properties?.__rawString__;
        node.properties.__npmCommand__ = npmCommand;
        node.properties.__yarnCommand__ = npmCommand;
        node.properties.__pnpmCommand__ = npmCommand.replace('npx', 'pnpm dlx');
        node.properties.__bunCommand__ = npmCommand.replace(
          'npx',
          'bunx --bun'
        );
      }
    });
  };
}
