const variantForShadcn = (language, style) =>
  `${(language || 'JS').toUpperCase()}-${(style || 'CSS').toUpperCase().replace('TAILWIND', 'TW')}`;

const UPPERCASE_PARTS = new Set(['ascii', 'crt']);

const slugToComponentName = slug => {
  if (!slug) return '';
  return slug
    .split('-')
    .map(part => {
      if (UPPERCASE_PARTS.has(part.toLowerCase())) return part.toUpperCase();
      return part.charAt(0).toUpperCase() + part.slice(1);
    })
    .join('');
};

export const generateCliCommands = (language, style, category, subcategory, dependencies = '') => {
  if (!category || !subcategory) return null;

  const shadcnVariant = category === 'sounds' ? (language || 'JS').toUpperCase() : variantForShadcn(language, style);

  const componentName = slugToComponentName(subcategory);
  const baseUrl = 'https://reactbits.dev';

  const jsrepoUrl = `${baseUrl}/r/${componentName}-${shadcnVariant}`;
  const shadcnUrl = `@react-bits/${componentName}-${shadcnVariant}`;

  const prefixCommands = {
    pnpm: 'pnpm dlx',
    npx: 'npx',
    yarn: 'yarn',
    bun: 'bun x --bun'
  };

  const jsrepo = Object.fromEntries(
    Object.entries(prefixCommands).map(([mgr, prefix]) => [mgr, `${prefix} jsrepo@latest add ${jsrepoUrl}`])
  );

  const shadcn = Object.fromEntries(
    Object.entries(prefixCommands).map(([mgr, prefix]) => [mgr, `${prefix} shadcn@latest add ${shadcnUrl}`])
  );

  const depsString = typeof dependencies === 'string' ? dependencies.trim() : '';
  const manual = depsString
    ? {
        pnpm: `pnpm add ${depsString}`,
        npm: `npm install ${depsString}`,
        yarn: `yarn add ${depsString}`,
        bun: `bun add ${depsString}`
      }
    : null;

  return { manual, jsrepo, shadcn };
};