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 { AccumulatorReportView } from "./_components/accumulator-report/accumulator-report-view";
import { ACCUMULATOR_REPORT_PERMISSION } from "./_lib/accumulator-report-route";
import {
  buildAccumulatorQueryFromBootstrap,
  parseAccumulatorUrlBootstrap,
} from "./_lib/parse-accumulator-url-bootstrap";
import { serializeReportQuery } from "@/app/customer/[tenant]/reports/_shared/lib/serialize-report-query";

import { fetchAccumulatorReportList } from "./_lib/accumulator-report-server-api";

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

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

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

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

  return (
    <CustomerPageShell>
      {permissionDenied ? (
        <ErrorBanner message="Permission denied for the Accumulator Report." />
      ) : (
        <AccumulatorReportView
          showPotentialActions={canShowReportPotentialActions(session.user)}
          initialLifecycle={bootstrap.lifecycle}
          initialProductFilter={bootstrap.productFilter}
          initialFilters={bootstrap.filters}
          initialColumnFilters={bootstrap.columnFilters}
          initialPage={bootstrap.page}
          initialPageSize={bootstrap.pageSize}
          initialSortKey={bootstrap.sortKey}
          initialSortOrder={bootstrap.sortOrder}
          initialListData={listResult.data}
          initialListError={listResult.errorMessage}
          initialListQueryKey={initialQueryKey}
        />
      )}
    </CustomerPageShell>
  );
}
