"use client";

import React, {
  createContext,
  useContext,
  useState,
  ReactNode,
} from "react";
import { useEventData } from "@/hooks/programs/useEventData";
import { Event } from "@/types/Programs";


interface EventsContextType {
  events: Event[];
  filteredEvents: Event[];
  searchQuery: string;
  selectedDate: string;
  selectedType: string;
  isLoading: boolean;
  setSearchQuery: (query: string) => void;
  setSelectedDate: (date: string) => void;
  setSelectedType: (type: string) => void;
  clearFilters: () => void;
}

const EventsContext = createContext<EventsContextType | undefined>(undefined);

interface EventsProviderProps {
  children: ReactNode;
  initialEvents: Event[];
}

export function EventsProvider({
  children,
  initialEvents,
}: EventsProviderProps) {
  const [searchQuery, setSearchQuery] = useState("");
  const [selectedDate, setSelectedDate] = useState("");
  const [selectedType, setSelectedType] = useState("");

  // Convert string IDs to numbers for API
  const categoryId = selectedType ? parseInt(selectedType) : undefined;
  const dateId = selectedDate ? parseInt(selectedDate) : undefined;
  const keyword = searchQuery.trim() || undefined;

  // Use API for filtering
  const { data: filteredEvents, isLoading } = useEventData(
    categoryId,
    dateId,
    keyword
  );

  // Fallback to initial events if no API data
  const events = filteredEvents || initialEvents;

  const clearFilters = () => {
    setSearchQuery("");
    setSelectedDate("");
    setSelectedType("");
  };

  const value: EventsContextType = {
    events: initialEvents,
    filteredEvents: events,
    searchQuery,
    selectedDate,
    selectedType,
    isLoading,
    setSearchQuery,
    setSelectedDate,
    setSelectedType,
    clearFilters,
  };

  return (
    <EventsContext.Provider value={value}>{children}</EventsContext.Provider>
  );
}

export function useEvents() {
  const context = useContext(EventsContext);
  if (context === undefined) {
    throw new Error("useEvents must be used within an EventsProvider");
  }
  return context;
}
