// sigproRouter for Vite
export function sigproRouter() {
  const virtualModuleId = 'virtual:sigpro-routes';
  const resolvedVirtualModuleId = '\0' + virtualModuleId;

  const getFiles = (dir) => {
    if (!fs.existsSync(dir)) return [];
    return fs.readdirSync(dir, { recursive: true })
      .filter(file => /\.(js|jsx)$/.test(file) && !path.basename(file).startsWith('_'))
      .map(file => path.resolve(dir, file));
  };

  const pathToUrl = (pagesDir, filePath) => {
    let relative = path.relative(pagesDir, filePath)
      .replace(/\\/g, '/')
      .replace(/\.(js|jsx)$/, '')
      .replace(/\/index$/, '')
      .replace(/^index$/, '');
    return ('/' + relative)
      .replace(/\/+/g, '/')
      .replace(/\[\.\.\.([^\]]+)\]/g, '*')
      .replace(/\[([^\]]+)\]/g, ':$1')
      .replace(/\/$/, '') || '/';
  };

  return {
    name: 'sigpro-router',
    resolveId(id) {
      if (id === virtualModuleId) return resolvedVirtualModuleId;
    },
    load(id) {
      if (id !== resolvedVirtualModuleId) return;
      const root = process.cwd();
      const pagesDir = path.resolve(root, 'src/pages');
      const files = getFiles(pagesDir).sort((a, b) => {
        const urlA = pathToUrl(pagesDir, a);
        const urlB = pathToUrl(pagesDir, b);
        if (urlA.includes(':') && !urlB.includes(':')) return 1;
        if (!urlA.includes(':') && urlB.includes(':')) return -1;
        return urlB.length - urlA.length;
      });

      let routeEntries = '';
      files.forEach((fullPath) => {
        const urlPath = pathToUrl(pagesDir, fullPath);
        const relativeImport = './' + path.relative(root, fullPath).replace(/\\/g, '/');
        routeEntries += `  { path: '${urlPath}', component: () => import('/${relativeImport}') },\n`;
      });
      if (!routeEntries.includes("path: '*'")) {
        routeEntries += `  { path: '*', component: () => ({ default: () => document.createTextNode('404 - Not Found') }) },\n`;
      }
      return `export const routes = [\n${routeEntries}];`;
    }
  };
}
