import { type Event, eventQueries } from "@/entities/event";
import { useQuery } from "@tanstack/react-query";
import { EventCard } from "./EventCard";

import { useAuthSlice } from "@/app/providers";
import type { User } from "@/entities/user";
import { ErrorMessage } from "@/shared/ui/ErrorMessage";
import { Loader } from "@/shared/ui/Loader";
import { useSearchParams } from "react-router";

type EventsListProps = {
  limit?: number;
  filterFn?: (event: Event, user: User) => boolean;
  searchParamName?: string;
};

export const EventsList: React.FC<EventsListProps> = ({
  limit,
  filterFn,
  searchParamName = "search",
}) => {
  const [searchParams] = useSearchParams();
  const searchQuery = searchParams.get(searchParamName) || undefined;

  const {
    data: events,
    error,
    isLoading,
  } = useQuery(eventQueries.list(searchQuery));
  const { user } = useAuthSlice();

  // Some filters (e.g. `myEventsFilter`) expect `tickets`/`address` to exist.
  // Provide safe defaults when wallet is not connected yet.
  const maybeUser: User =
    user ??
    ({
      address: "",
      roles: ["customer"],
      tickets: [],
      socials: [],
      profileManagerBps: 0,
    } as User);

  if (isLoading) return <Loader />;
  if (error) return <ErrorMessage errors={error} />;
  if (!events) return <p>No data for some reason</p>;

  const displayEvents = filterFn
    ? events.filter((event) => filterFn(event, maybeUser))
    : events;
  const limitedEvents = limit ? displayEvents.slice(0, limit) : displayEvents;

  if (limitedEvents.length <= 0) {
    return <p className="text-center text-secondary/60">No events!</p>;
  }

  return (
    <div className="flex flex-col gap-6 px-3">
      {limitedEvents.map((event) => (
        <EventCard key={event.id} event={event} />
      ))}
    </div>
  );
};

Graph