import { Users } from "lucide-react";

import { ListPageCard } from "@/app/dashboard/_components";
import { ErrorBanner } from "@/components/shared/error-banner";
import { parseListSearchParams } from "@/lib/server/parse-list-search-params";

import { CustomersHeaderActions, CustomersTable } from "./_components/customers-table";
import {
  fetchBackendCustomers,
  fetchBackendSubCustomers,
  parseCustomerFiltersFromSearchParams,
} from "./_lib/customers-server-api";

export const dynamic = "force-dynamic";

type CustomersPageProps = {
  searchParams: Promise<Record<string, string | undefined>>;
};

export default async function CustomersPage({ searchParams }: CustomersPageProps) {
  const query = await searchParams;
  const parentId = query.parentCustomer ? Number(query.parentCustomer) : NaN;
  const isSubCustomersView = Number.isFinite(parentId) && parentId > 0;
  const impersonateError =
    typeof query.impersonate_error === "string" && query.impersonate_error.trim()
      ? query.impersonate_error.trim()
      : null;

  const { page, pageSize } = parseListSearchParams(query, 20);
  const filters = parseCustomerFiltersFromSearchParams(query);

  const subCustomersResult = isSubCustomersView
    ? await fetchBackendSubCustomers({ customerId: parentId, page, pageSize, customerFilters: filters })
    : null;
  const result =
    subCustomersResult ?? (await fetchBackendCustomers({ page, pageSize, customerFilters: filters }));

  const parentLabel = subCustomersResult?.headingSuffix || `Parent #${parentId}`;

  return (
    <ListPageCard
      icon={Users}
      title={isSubCustomersView ? "Sub-customers" : "Customers"}
      breadcrumb={
        isSubCustomersView
          ? [
              { label: "Customers", href: "/dashboard/customers" },
              { label: parentLabel },
              { label: "Sub-customers" },
            ]
          : [{ label: "Customers" }]
      }
      actions={<CustomersHeaderActions data={result.rows} />}
    >
      <ErrorBanner message={impersonateError} className="mb-4" />
      <ErrorBanner message={result.errorMessage} className="mb-4" />
      <CustomersTable
        data={result.rows}
        parentCustomerId={isSubCustomersView ? parentId : undefined}
        initialFilters={filters}
        pagination={{
          page: result.page,
          pageSize: result.pageSize,
          totalCount: result.totalCount,
          pageCount: result.pageCount,
        }}
      />
    </ListPageCard>
  );
}
