import { createSelector, createSlice, type PayloadAction } from "@reduxjs/toolkit";
import { partners, type PartnerFocus, type PartnerRegion } from "@/data/partners";
import type { RootState } from "../index";

export const ALL_REGIONS = "All Regions";

interface DirectoryState {
  /** Empty string = untouched "Location" placeholder (behaves like all regions). */
  location: PartnerRegion | typeof ALL_REGIONS | "";
  /** Empty string = no focus filter. */
  focus: PartnerFocus | "";
}

const initialState: DirectoryState = { location: "", focus: "" };

const directorySlice = createSlice({
  name: "directory",
  initialState,
  reducers: {
    setLocation: (state, action: PayloadAction<DirectoryState["location"]>) => {
      state.location = action.payload;
    },
    setFocus: (state, action: PayloadAction<DirectoryState["focus"]>) => {
      state.focus = action.payload;
    },
    resetFilters: () => initialState,
  },
});

export const { setLocation, setFocus, resetFilters } = directorySlice.actions;
export default directorySlice.reducer;

export const selectDirectoryFilters = (state: RootState) => state.directory;

export const selectVisiblePartners = createSelector(selectDirectoryFilters, ({ location, focus }) =>
  partners.filter(
    (partner) =>
      (!location || location === ALL_REGIONS || partner.location === location) &&
      (!focus || partner.focus === focus),
  ),
);
