import { RouteCatalog } from './RouteCatalog';

/**
 * RouteAccessPolicy - Determines access requirements for routes
 * 
 * Responsibilities:
 * - Check if a route is public
 * - Check if a route is an auth page
 * - Determine required roles for a route
 * - Get home path for a specific role
 * 
 * Design: Uses ONLY RouteCatalog patterns/matchers, no hardcoded arrays/strings
 */
export class RouteAccessPolicy {
  constructor(private catalog: RouteCatalog) {}

  /**
   * Check if a logical pathname is publicly accessible
   * @param logicalPathname - The path to check
   * @returns true if the route is public (no auth required)
   */
  isPublic(logicalPathname: string): boolean {
    // Get the route ID for this path
    const routeId = this.catalog.getRouteIdByPath(logicalPathname);
    
    if (!routeId) {
      // No route found, not public
      return false;
    }
    
    // Check if this route ID is in the public routes list
    const publicRouteIds = this.catalog.listPublicRoutes();
    return publicRouteIds.includes(routeId);
  }

  /**
   * Check if a logical pathname is an auth page
   * @param logicalPathname - The path to check
   * @returns true if the route is an auth page
   */
  isAuthPage(logicalPathname: string): boolean {
    return this.catalog.isAuthPage(logicalPathname);
  }

  /**
   * Get required roles for a logical pathname
   * @param logicalPathname - The path to check
   * @returns Array of required roles, or null if no specific role required
   */
  requiredRoles(logicalPathname: string): string[] | null {
    // Use catalog's role-based access method
    const roles = this.catalog.getRequiredRoles(logicalPathname);
    console.log(`[RouteAccessPolicy] requiredRoles for ${logicalPathname}:`, roles);
    return roles;
  }

  /**
   * Get the home path for a specific role
   * @param role - The role name
   * @returns The logical path for that role's home page
   */
  roleHome(role: string): string {
    return this.catalog.getRoleHome(role);
  }

  /**
   * Get the route ID for a specific role's home page
   * @param role - The role name
   * @returns The route ID for that role's home page
   */
  roleHomeRouteId(role: string): string {
    return this.catalog.getRoleHomeRouteId(role);
  }
}