import { AssetXmlUploadViewPage } from "@/components/xml-apis/asset-xml-upload/asset-xml-upload-view-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 { fetchBackendAssetXmlUploadViewData } from "../../_lib/asset-xml-upload-server-api"

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

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

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
}

export default async function AssetXmlUploadViewRoute({
  params,
  searchParams,
}: AssetXmlUploadViewRouteProps) {
  const { id } = await params
  const resolvedSearchParams = await searchParams
  const query = toSearchParams(resolvedSearchParams)
  const shouldReupdate = firstParam(resolvedSearchParams.reupdate) === "1"
  const page = Number(firstParam(resolvedSearchParams.page) ?? "1")
  const pageSize = Number(firstParam(resolvedSearchParams.page_size) ?? "20")
  const bankApiId = resolveAssetXmlBankId(firstParam(resolvedSearchParams.bank_id))
  const filters = parseAssetXmlBankListFilters(query)

  const { detail, errorMessage } = await fetchBackendAssetXmlUploadViewData(id, {
    page: Number.isFinite(page) && page > 0 ? page : 1,
    pageSize: Number.isFinite(pageSize) && pageSize > 0 ? pageSize : 20,
    reupdate: shouldReupdate,
    bankApiId,
    filters,
  })

  return (
    <AssetXmlUploadViewPage
      uploadId={id}
      initialView={detail}
      initialErrorMessage={errorMessage}
      serverResolved
      reupdate={shouldReupdate}
      bankApiId={bankApiId}
      initialFilters={filters}
      queryKey={query.toString()}
    />
  )
}
