import { CustomerPageShell } from "@/app/customer/_components/customer-page-shell";
import { ErrorBanner } from "@/components/shared/error-banner";
import { getCustomerSessionContext } from "@/lib/frontend-auth/server";
import { canShowReportPotentialActions } from "@/lib/frontend-auth/report-capabilities";

import { StructuredProductView } from "./_components/structured-product-report/structured-product-view";
import {
  buildStructuredProductQueryFromBootstrap,
  parseStructuredProductUrlBootstrap,
} from "./_lib/parse-structured-product-url-bootstrap";
import { serializeReportQuery } from "@/app/customer/[tenant]/reports/_shared/lib/serialize-report-query";
import { STRUCTURED_PRODUCT_PERMISSION } from "./_lib/structured-product-route";
import { fetchStructuredProductList } from "./_lib/structured-product-server-api";

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

export default async function StructuredProductReportPage({ params, searchParams }: PageProps) {
  const { tenant } = await params;
  const resolvedSearchParams = await searchParams;
  const bootstrap = parseStructuredProductUrlBootstrap(resolvedSearchParams);
  const session = await getCustomerSessionContext(tenant);
  const permissionDenied =
    session.user != null && !session.permissions.routes.includes(STRUCTURED_PRODUCT_PERMISSION);

  const initialQuery = buildStructuredProductQueryFromBootstrap(bootstrap);
  const initialQueryKey = serializeReportQuery(initialQuery);

  const listResult =
    !permissionDenied && session.user != null
      ? await fetchStructuredProductList(initialQuery, tenant)
      : { data: null, errorMessage: null, status: 401 };

  return (
    <CustomerPageShell>
      {permissionDenied ? (
        <ErrorBanner message="Permission denied for the Structured Products Report." />
      ) : (
        <StructuredProductView
          showPotentialActions={canShowReportPotentialActions(session.user)}
          initialLifecycle={bootstrap.lifecycle}
          initialFilters={bootstrap.filters}
          initialPage={bootstrap.page}
          initialPageSize={bootstrap.pageSize}
          initialSortColumn={bootstrap.sortColumn}
          initialSortDirection={bootstrap.sortDirection}
          initialListData={listResult.data}
          initialListError={listResult.errorMessage}
          initialListQueryKey={initialQueryKey}
        />
      )}
    </CustomerPageShell>
  );
}
