"use client"

import { trpc } from "@/lib/trpc/client"

import LoadingSpinner from "@/components/LoadingSpinner"
import Grids from "@/components/TempDesignSystem/Grids"
import useLang from "@/hooks/useLang"

import ListContainer from "../ListContainer"
import ShowMoreButton from "../ShowMoreButton"
import StayCard from "../StayCard"

import type {
  PreviousStaysClientProps,
  PreviousStaysNonNullResponseObject,
} from "@/types/components/myPages/stays/previous"

export default function ClientPreviousStays({
  initialPreviousStays,
}: PreviousStaysClientProps) {
  const lang = useLang()
  const { data, isFetching, fetchNextPage, hasNextPage, isLoading } =
    trpc.user.stays.previous.useInfiniteQuery(
      {
        limit: 6,
        lang,
      },
      {
        getNextPageParam: (lastPage) => {
          return lastPage?.nextCursor
        },
        initialData: {
          pageParams: [undefined, 1],
          pages: [initialPreviousStays],
        },
      }
    )

  function loadMoreData() {
    if (hasNextPage) {
      fetchNextPage()
    }
  }

  // TS having a hard time with the filtered type.
  // This is only temporary as we will not return null
  // later on when we handle errors appropriately.
  const filteredStays = (data?.pages.filter((page) => page?.data) ??
    []) as unknown as PreviousStaysNonNullResponseObject[]
  const stays = filteredStays.flatMap((page) => page.data)

  return isLoading ? (
    <LoadingSpinner />
  ) : (
    <ListContainer>
      <Grids.Stackable>
        {stays.map((stay) => (
          <StayCard key={stay.attributes.confirmationNumber} stay={stay} />
        ))}
      </Grids.Stackable>
      {hasNextPage ? (
        <ShowMoreButton disabled={isFetching} loadMoreData={loadMoreData} />
      ) : null}
    </ListContainer>
  )
}
