import {
  navigation,
  type NavigationItem,
} from "@/config/dashboard-navigation";
import type { UserProfile } from "@/types/auth.types";
import { normalizePath } from "@/lib/dashboard-route-utils";

type DashboardAccessUser = Pick<UserProfile, "role" | "permissions">;

export function hasDashboardPermission(
  user: DashboardAccessUser | null,
  permission: string,
): boolean {
  if (user?.role === "SUPER_ADMIN") return true;
  if (user?.role === "USER" && permission === "profile.read") return true;
  return Array.isArray(user?.permissions) && user.permissions.includes(permission);
}

export function canAccessDashboardRoute(
  pathname: string,
  user: DashboardAccessUser | null,
): boolean {
  if (user?.role === "SUPER_ADMIN") return true;

  const path = normalizePath(pathname);
  const requiredPermission = navigation
    .flatMap((item) => [item, ...(item.children ?? [])])
    .find((item) => normalizePath(item.href) === path)?.permission;

  if (requiredPermission) {
    return hasDashboardPermission(user, requiredPermission);
  }

  const userDetailPath = /^\/dashboard\/users\/[^/]+$/.test(path);
  if (userDetailPath && path !== "/dashboard/users/create") {
    return hasDashboardPermission(user, "users.read");
  }

  const registrationDetailPath =
    /^\/dashboard\/registrations\/[^/]+$/.test(path) &&
    path !== "/dashboard/registrations/create";
  if (registrationDetailPath) {
    return hasDashboardPermission(user, "registrations.read");
  }

  return false;
}

export function getVisibleNavigation(
  user: DashboardAccessUser | null,
): NavigationItem[] {
  return navigation.flatMap((item) => {
    const itemAllowed = hasDashboardPermission(user, item.permission);

    if (!item.children) {
      return itemAllowed ? [item] : [];
    }

    const visibleChildren = item.children.filter((child) =>
      hasDashboardPermission(user, child.permission),
    );

    if (!itemAllowed && visibleChildren.length === 0) {
      return [];
    }

    return [
      {
        ...item,
        href: itemAllowed ? item.href : visibleChildren[0].href,
        children: visibleChildren,
      },
    ];
  });
}
