import { Suspense } from "react";

import { CustomerPageShell } from "@/app/customer/_components/customer-page-shell";
import { fetchAccessUsers } from "@/app/customer/_lib/admin/access-server-api";
import {
  loadAdminPageContext,
  parseAdminListPageQuery,
} from "@/app/customer/_lib/admin/load-admin-page-context";
import {
  canAssignRoles,
  canManageSection,
  pageKeysForSection,
} from "@/app/customer/_lib/admin/admin-section-permissions";
import { resolveClientPageCount } from "@/lib/list-pagination";

import { UsersPageClient } from "./_components/users-page-client";

type PageProps = {
  params: Promise<{ tenant: string }>;
  searchParams: Promise<Record<string, string | string[] | undefined>>;
};

export default async function CustomerAdminUsersPage({
  params,
  searchParams,
}: Readonly<PageProps>) {
  const { tenant } = await params;
  const ctx = await loadAdminPageContext(tenant, {
    page: pageKeysForSection("users"),
    label: "Users",
  });
  if (ctx.denied) {
    return ctx.deniedView;
  }

  const query = await searchParams;
  const { page, pageSize, q } = parseAdminListPageQuery(query, 20);

  const result = await fetchAccessUsers(tenant, { q, page, pageSize });
  const data = result.data;
  const totalCount = data?.totalCount ?? data?.items?.length ?? 0;
  const resolvedPageSize = data?.pageSize ?? pageSize;
  const resolvedPage = data?.page ?? page;
  const pageCount = data?.pageCount ?? resolveClientPageCount(totalCount, resolvedPageSize);

  return (
    <CustomerPageShell tutorialTarget="admin-users">
      <Suspense fallback={null}>
        <UsersPageClient
          tenant={tenant}
          initialUsers={data?.items ?? []}
          groups={data?.groups ?? []}
          initialErrorMessage={result.errorMessage}
          canManageUsers={canManageSection("users", ctx.capabilities)}
          canAssignRoles={canAssignRoles(ctx.capabilities)}
          initialQ={q}
          pagination={{
            page: resolvedPage,
            pageSize: resolvedPageSize,
            totalCount,
            pageCount,
          }}
        />
      </Suspense>
    </CustomerPageShell>
  );
}
