"use client";

import { usePressData } from "@/hooks/press/usePressData";
import { Press } from "@/types/Press";
import React, { createContext, useContext, useState, ReactNode } from "react";

export interface PressRelease {
  id: string;
  image: string;
  alt: string;
  title: string;
  description: string;
  category: string;
  readTime?: string;
  date: string;
}

interface PressReleasesContextType {
  pressReleases: Press[];
  filteredPressReleases: Press[];
  searchQuery: string;
  selectedCategories: string[];
  selectedDate: string | undefined;
  isLoading: boolean;
  error: Error | null;
  setSearchQuery: (query: string) => void;
  setSelectedCategories: (
    categories: string[] | ((prev: string[]) => string[])
  ) => void;
  setSelectedDate: (date: string | undefined) => void;
  clearFilters: () => void;
}

const PressReleasesContext = createContext<
  PressReleasesContextType | undefined
>(undefined);

interface PressReleasesProviderProps {
  children: ReactNode;
  initialPressReleases: Press[];
}

export function PressReleasesProvider({
  children,
  initialPressReleases,
}: PressReleasesProviderProps) {
  const [searchQuery, setSearchQuery] = useState("");
  const [selectedCategories, setSelectedCategories] = useState<string[]>([]);
  const [selectedDate, setSelectedDate] = useState<string | undefined>(
    undefined
  );

  // Convert selectedCategories to numbers for API call
  const categoryIds =
    selectedCategories.length > 0
      ? selectedCategories
          .map((cat) => parseInt(cat))
          .filter((id) => !isNaN(id))
      : undefined;

  // Convert selectedDate to timestamp for API call
  const pressDate = selectedDate ? selectedDate : undefined;

  const {
    data: filteredPressReleases,
    isLoading,
    error,
  } = usePressData(
    categoryIds,
    pressDate,
    searchQuery.trim() !== "" ? searchQuery.trim() : undefined
  );

  // Fallback to initial press releases if no API data
  const pressReleases = filteredPressReleases || initialPressReleases;

  const clearFilters = () => {
    setSearchQuery("");
    setSelectedCategories([]);
    setSelectedDate(undefined);
  };

  const value: PressReleasesContextType = {
    pressReleases: initialPressReleases,
    filteredPressReleases: pressReleases,
    searchQuery,
    selectedCategories,
    selectedDate,
    isLoading,
    error,
    setSearchQuery,
    setSelectedCategories,
    setSelectedDate,
    clearFilters,
  };

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

export function usePressReleases() {
  const context = useContext(PressReleasesContext);
  if (context === undefined) {
    throw new Error(
      "usePressReleases must be used within a PressReleasesProvider"
    );
  }
  return context;
}
