// Zustand store for app-level shared state (persisted to sessionStorage).
// No provider needed — import useAppStore or useAppContext anywhere.

import { create } from 'zustand';
import { persist, createJSONStorage } from 'zustand/middleware';

interface AppState {
  searchQuery: string;
  setSearchQuery: (value: string) => void;
  activeFilters: { sectors: string[]; exchanges: string[]; priceMin: number | null; priceMax: number | null; marketCapRange: string | null; volumeMin: number | null; volumeMax: number | null };
  setActiveFilters: (value: { sectors: string[]; exchanges: string[]; priceMin: number | null; priceMax: number | null; marketCapRange: string | null; volumeMin: number | null; volumeMax: number | null }) => void;
  sortConfig: { field: string; direction: 'asc' | 'desc' };
  setSortConfig: (value: { field: string; direction: 'asc' | 'desc' }) => void;
  viewMode: 'table' | 'grid';
  setViewMode: (value: 'table' | 'grid') => void;
  currentPage: number;
  setCurrentPage: (value: number) => void;
  itemsPerPage: number;
  setItemsPerPage: (value: number) => void;
  sessionId: string;
  clearSession: () => void;
}

const useAppStore = create<AppState>()((
  persist(
    (set) => ({
    sessionId: crypto.randomUUID(),
    searchQuery: "",
    activeFilters: { sectors: [], exchanges: [], priceMin: null, priceMax: null, marketCapRange: null, volumeMin: null, volumeMax: null },
    sortConfig: { field: 'ticker', direction: 'asc' },
    viewMode: "table",
    currentPage: 1,
    itemsPerPage: 25,
    setSearchQuery: (value) => set({ searchQuery: value }),
    setActiveFilters: (value) => set({ activeFilters: value }),
    setSortConfig: (value) => set({ sortConfig: value }),
    setViewMode: (value) => set({ viewMode: value }),
    setCurrentPage: (value) => set({ currentPage: value }),
    setItemsPerPage: (value) => set({ itemsPerPage: value }),
    clearSession: () => set({ sessionId: crypto.randomUUID(), searchQuery: "", activeFilters: { sectors: [], exchanges: [], priceMin: null, priceMax: null, marketCapRange: null, volumeMin: null, volumeMax: null }, sortConfig: { field: 'ticker', direction: 'asc' }, viewMode: "table", currentPage: 1, itemsPerPage: 25 }),
    }),
    {
      name: 'stock_listing_session',
      storage: createJSONStorage(() => sessionStorage),
    },
  )
));

// Convenience alias — pages import useAppContext.
const useAppContext = useAppStore;

export { useAppStore, useAppContext };
