import { UploadXmlListPage } from "@/components/xml-apis/upload-xml/upload-xml-list-page";
import {
  parseUploadXmlListFilters,
  parseUploadXmlListSort,
} from "@/components/xml-apis/upload-xml/data/upload-xml-list-filters";

import { fetchBackendUploadXml } from "./_lib/upload-xml-server-api";

type UploadXmlPageProps = {
  searchParams: Promise<{
    bank?: string;
    date?: string;
    date_range?: string;
    inserted?: string;
    search?: string;
    url?: string;
    type?: string;
    page?: string;
    page_size?: string;
    sort_by?: string;
    sort_dir?: string;
  }>;
};

function toUrlSearchParams(
  params: Record<string, string | undefined>,
): URLSearchParams {
  const searchParams = new URLSearchParams();
  for (const [key, value] of Object.entries(params)) {
    if (value) searchParams.set(key, value);
  }
  return searchParams;
}

export default async function UploadXmlListRoute({
  searchParams,
}: UploadXmlPageProps) {
  const params = await searchParams;
  const query = toUrlSearchParams(params);
  const filters = parseUploadXmlListFilters(query);
  const sort = parseUploadXmlListSort(query);
  const page = Number(params.page ?? "1");
  const pageSize = Number(params.page_size ?? "20");
  const resolvedPage = Number.isFinite(page) && page > 0 ? page : 1;
  const resolvedPageSize =
    Number.isFinite(pageSize) && pageSize > 0 ? pageSize : 20;

  const result = await fetchBackendUploadXml(filters, {
    page: resolvedPage,
    pageSize: resolvedPageSize,
    sort,
  });

  return (
    <UploadXmlListPage
      initialData={result.items}
      initialTotalCount={result.totalCount}
      initialPage={result.page}
      initialPageSize={result.pageSize}
      initialPageCount={result.pageCount}
      initialErrorMessage={result.errorMessage}
      initialFilters={filters}
      initialSort={sort}
      dateQuickFilters={result.dateQuickFilters}
      bankQuickFilters={result.bankQuickFilters}
    />
  );
}
