import { AssetXmlUploadListPage } from "@/components/xml-apis/asset-xml-upload/asset-xml-upload-list-page"
import { resolveAssetXmlBankId } from "@/components/xml-apis/asset-xml-upload/data/asset-xml-upload-banks"
import { parseAssetXmlBankListFilters } from "@/components/xml-apis/asset-xml-upload/data/asset-xml-upload-list-filters"
import { fetchBackendAssetXmlUpload } from "./_lib/asset-xml-upload-server-api"

type AssetXmlUploadPageProps = {
  searchParams: Promise<Record<string, string | string[] | undefined>>
}

function toSearchParams(
  params: Record<string, string | string[] | undefined>
): URLSearchParams {
  const search = new URLSearchParams()

  for (const [key, value] of Object.entries(params)) {
    if (typeof value === "string" && value.trim()) {
      search.set(key, value)
    }
  }

  return search
}

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

export default async function AssetXmlUploadListRoute({
  searchParams,
}: AssetXmlUploadPageProps) {
  const params = await searchParams
  const query = toSearchParams(params)
  const bankId = resolveAssetXmlBankId(
    firstParam(params.bank_id) ?? firstParam(params.bank)
  )
  const page = Number(firstParam(params.page) ?? "1")
  const defaultPageSize = bankId ? 20 : 10
  const pageSize = Number(firstParam(params.page_size) ?? String(defaultPageSize))
  const filters = bankId ? parseAssetXmlBankListFilters(query) : undefined
  const {
    items,
    totalCount,
    page: currentPage,
    pageSize: currentPageSize,
    pageCount,
    bankView,
    errorMessage,
  } = await fetchBackendAssetXmlUpload({
    bankId,
    page: Number.isFinite(page) && page > 0 ? page : 1,
    pageSize: Number.isFinite(pageSize) && pageSize > 0 ? pageSize : defaultPageSize,
    filters,
  })

  return (
    <AssetXmlUploadListPage
      initialData={items}
      initialTotalCount={totalCount}
      initialPage={currentPage}
      initialPageSize={currentPageSize}
      initialPageCount={pageCount}
      initialErrorMessage={errorMessage}
      bankId={bankId}
      filters={filters}
      initialBankView={bankView ?? null}
    />
  )
}
