import BreadCrumbLink from "@/layouts/shared/page.breadcrumbLink";
import {
  getMemberAccessAssignments,
  listMemberAccess,
  listMemberAccessRoles,
  type MemberAccess,
  type MemberAccessRole,
  type MemberAccessRow,
} from "@/lib/features/members/access";
import { createRoleProtectedLoader } from "@/lib/features/protectedFetcher";
import { FEATURE_SLUGS } from "@/lib/role-helpers";
import MemberAccessUserClientPage from "./_client";

export const handle = {
  breadcrumb: ({ params }: { params: { userId: string } }) => (
    <BreadCrumbLink
      links={[
        { label: "Accounts", to: "/admin/members" },
        { label: "Access", to: "/admin/members/access" },
        { label: params.userId },
      ]}
    />
  ),
};

export const loader = createRoleProtectedLoader(
  FEATURE_SLUGS.memberAccessList,
  "read",
  async ({ request, params }) => {
    const userId = (params as { userId: string }).userId;
    const headers = { Cookie: request.headers.get("Cookie") ?? "" };
    // The user's row comes from the same list the index screen uses, so this
    // page needs no extra endpoint and can't drift from that view.
    const [accessRes, rolesRes, assignmentsRes] = await Promise.all([
      listMemberAccess(headers),
      listMemberAccessRoles(headers),
      // Read back the assignments and the access they add up to, rather than
      // trusting what the list row happened to carry.
      getMemberAccessAssignments(userId, headers),
    ]);
    const rows = accessRes?.success ? (accessRes.data?.access ?? []) : [];
    return {
      row: rows.find((entry) => entry.console_user_id === userId) ?? null,
      userId,
      rolesRes,
      assignmentsRes,
    };
  },
);

const MemberAccessUserPage: React.FC<{ loaderData: unknown }> = ({
  loaderData,
}) => {
  const { row, userId, rolesRes, assignmentsRes } = loaderData as {
    assignmentsRes?: {
      success: boolean;
      data?: { roles: MemberAccessRole[]; effective: MemberAccess };
    };
    row: MemberAccessRow | null;
    userId: string;
    rolesRes?: { success: boolean; data?: { roles: MemberAccessRole[] } };
  };

  return (
    <MemberAccessUserClientPage
      userId={userId}
      row={row}
      roles={rolesRes?.success ? (rolesRes.data?.roles ?? []) : []}
      assigned={assignmentsRes?.data?.roles ?? []}
      effective={assignmentsRes?.data?.effective}
    />
  );
};

export default MemberAccessUserPage;
