import { stringifyParams } from "../../core/routing/params.js";
import { getFallbackRoute, routeIsFallback, routeIsRedirect } from "../../core/routing/helpers.js";
import { callGetStaticPaths } from "../../core/render/route-cache.js";
class StaticPaths {
  #app;
  constructor(app) {
    this.#app = app;
  }
  /**
   * Get all static paths for prerendering with their associated routes.
   * This avoids needing to re-match routes later, which can be incorrect due to route priority.
   */
  async getAll() {
    const allPaths = [];
    const manifest = this.#app.manifest;
    const routesToGenerate = [];
    for (const { routeData } of manifest.routes) {
      if (!routeData.prerender) continue;
      if (routeIsRedirect(routeData)) {
        routesToGenerate.push(routeData);
        continue;
      }
      if (routeIsFallback(routeData) && manifest.i18n?.fallback) {
        routesToGenerate.push(routeData);
        continue;
      }
      routesToGenerate.push(routeData);
    }
    for (const route of routesToGenerate) {
      for (const currentRoute of eachRouteInRouteData(route)) {
        const paths = await this.#getPathsForRoute(currentRoute);
        for (const path of paths) {
          allPaths.push(path);
        }
      }
    }
    return allPaths;
  }
  /**
   * Get paths for a single route.
   * Note: Does not filter duplicates - that's handled by generate.ts with conflict detection.
   */
  async #getPathsForRoute(route) {
    const paths = [];
    const manifest = this.#app.manifest;
    const routeCache = this.#app.pipeline.routeCache;
    if (route.pathname) {
      paths.push({ pathname: route.pathname, route });
      return paths;
    }
    const componentInstance = await this.#app.pipeline.getComponentByRoute(route);
    const routeToProcess = routeIsRedirect(route) ? route.redirectRoute : routeIsFallback(route) ? getFallbackRoute(route, manifest.routes) : route;
    const actualRoute = routeToProcess ?? route;
    const staticPaths = await callGetStaticPaths({
      mod: componentInstance,
      route: actualRoute,
      routeCache,
      ssr: manifest.serverLike,
      base: manifest.base,
      trailingSlash: manifest.trailingSlash
    });
    for (const staticPath of staticPaths) {
      const pathname = stringifyParams(staticPath.params, route, manifest.trailingSlash);
      paths.push({ pathname, route });
    }
    return paths;
  }
}
function* eachRouteInRouteData(route) {
  yield route;
  for (const fallbackRoute of route.fallbackRoutes) {
    yield fallbackRoute;
  }
}
export {
  StaticPaths
};
