import { Suspense } from "react";

import { CustomerPageShell } from "@/app/customer/_components/customer-page-shell";
import { fetchAccessCustomers } from "@/app/customer/_lib/admin/access-server-api";
import { resolveClientPageCount } from "@/lib/list-pagination";
import { parseListSearchParams } from "@/lib/server/parse-list-search-params";

import { CustomersPageClient } from "./_components/customers-page-client";

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

function firstParam(value: string | string[] | undefined): string {
  if (Array.isArray(value)) {
    return value[0] ?? "";
  }
  return value ?? "";
}

export default async function CustomerAdminCustomersPage({
  params,
  searchParams,
}: Readonly<PageProps>) {
  const { tenant } = await params;
  const query = await searchParams;
  const { page, pageSize } = parseListSearchParams(
    {
      page: firstParam(query.page),
      pageSize: firstParam(query.pageSize),
    },
    20,
  );
  const q = firstParam(query.q).trim();

  const result = await fetchAccessCustomers(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>
      <Suspense fallback={null}>
        <CustomersPageClient
          tenant={tenant}
          initialCustomers={data?.items ?? []}
          groups={data?.groups ?? []}
          initialErrorMessage={result.errorMessage}
          initialQ={q}
          pagination={{
            page: resolvedPage,
            pageSize: resolvedPageSize,
            totalCount,
            pageCount,
          }}
        />
      </Suspense>
    </CustomerPageShell>
  );
}
