import { XrateXmlUploadViewPage } from "@/components/xml-apis/xrate-xml-upload/xrate-xml-upload-view-page"
import { parseXrateXmlValuesFilters } from "@/components/xml-apis/xrate-xml-upload/data/xrate-xml-upload-list-filters"
import { fetchBackendXrateXmlUploadViewData } from "../../_lib/xrate-xml-upload-server-api"

type XrateXmlUploadViewRouteProps = {
  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 XrateXmlUploadViewRoute({
  params,
  searchParams,
}: XrateXmlUploadViewRouteProps) {
  const { id } = await params
  const resolvedSearchParams = await searchParams
  const query = toSearchParams(resolvedSearchParams)
  const page = Number(firstParam(resolvedSearchParams.page) ?? "1")
  const pageSize = Number(firstParam(resolvedSearchParams.page_size) ?? "20")
  const filters = parseXrateXmlValuesFilters(query)

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

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

