"use client";

import { useQuery } from "@tanstack/react-query";
import { apiClient } from "@/lib/api/api-client";
import { useAuth } from "@/hooks/use-auth";

type RolePermissionsResponse = {
  permissions: string[];
};

export const rolePermissionsQueryKey = (role: string) =>
  ["role-permissions", role] as const;

export function useDashboardAccess() {
  const auth = useAuth();
  const role = auth.user?.role;
  const profilePermissions = auth.user?.permissions;
  const rolePermissionsQuery = useQuery({
    queryKey: rolePermissionsQueryKey(role ?? ""),
    queryFn: async () => {
      const response = await apiClient<RolePermissionsResponse>(
        `/roles/${encodeURIComponent(role!)}/permissions`,
      );

      const permissions =
        response.permissions ??
        (response as RolePermissionsResponse & {
          data?: RolePermissionsResponse;
        }).data?.permissions;

      if (!Array.isArray(permissions)) {
        throw new Error("The role permissions response is invalid.");
      }

      return permissions;
    },
    enabled:
      !!role &&
      role !== "SUPER_ADMIN" &&
      role !== "USER" &&
      !Array.isArray(profilePermissions),
    retry: false,
    staleTime: 0,
    refetchOnMount: "always",
    refetchOnWindowFocus: true,
  });

  const permissions =
    role === "SUPER_ADMIN"
      ? []
      : role === "USER"
        ? ["profile.read"]
        : Array.isArray(profilePermissions)
          ? profilePermissions
          : rolePermissionsQuery.data;

  return {
    user: auth.user
      ? {
          ...auth.user,
          permissions,
        }
      : null,
    isLoading:
      auth.isLoading ||
      (!!role &&
        role !== "SUPER_ADMIN" &&
        role !== "USER" &&
        !Array.isArray(profilePermissions) &&
        rolePermissionsQuery.isPending),
    isError:
      auth.isError ||
      (!Array.isArray(profilePermissions) &&
        role !== "SUPER_ADMIN" &&
        role !== "USER" &&
        rolePermissionsQuery.isError),
    error: rolePermissionsQuery.error ?? auth.error,
  };
}
