import { SortByProduct } from "@/lib/types/enums";
import {
  CategoryFilterModel,
  FinalQuantityModel,
  ProductItemModel,
  ProductQuantityModel,
  ProductQuantityOptionModel,
  ProductTemplateModel,
  ProductTurnaroundTimeModel,
} from "@/lib/types/models";
import { create } from "zustand";

export type SortByOption =
  | SortByProduct.ALL
  | SortByProduct.POPULARITY
  | SortByProduct.LATEST
  | SortByProduct.BEST_SELL
  | SortByProduct.LOW_TO_HIGH
  | SortByProduct.HIGH_TO_LOW;

export type State = {
  categoryFilter: CategoryFilterModel[];
  sortBy: SortByOption;
  products: ProductItemModel[];
  quantityOption: FinalQuantityModel[];
  selectedProductIndex: number | 0;
  finalProductOption: Record<string, string>;
  selectQuantityAndEstimatedDate: Record<string, string>;
  templateData: ProductTemplateModel | null;
  templateOption: Record<string, string>;
  turnaroundTimeOptionData: ProductTurnaroundTimeModel[];
  quantityOptionData: ProductQuantityOptionModel[];
};

export type Actions = {
  setCategoryFilter: (data: CategoryFilterModel[]) => void;
  setSortBy: (option: SortByOption) => void;
  setProducts: (data: ProductItemModel[]) => void;
  setProductQuantity: (data: FinalQuantityModel[]) => void;
  resetFilters: () => void;
  setSelectedProductIndex: (val: number) => void;
  setFinalProductOption: (data: Record<string, string>) => void;
  setQuantityAndEstimatedDate: (data: Record<string, string>) => void;
  setTemplateData: (data: ProductTemplateModel | null) => void;
  setTemplateOption: (data: Record<string, string>) => void;
  setTurnaroundTimeOption: (data: ProductTurnaroundTimeModel[]) => void;
  setQuantityOption: (data: ProductQuantityOptionModel[]) => void;
};

export const useProductStore = create<State & Actions>((set) => ({
  // Initial state
  categoryFilter: [],
  sortBy: SortByProduct.ALL,
  products: [],
  quantityOption: [],
  selectedProductIndex: 0,
  finalProductOption: {},
  selectQuantityAndEstimatedDate: {},
  templateData: null,
  templateOption: {},
  turnaroundTimeOptionData: [],
  quantityOptionData: [],

  // Actions
  setCategoryFilter: (data) => set({ categoryFilter: data }),
  setSortBy: (option) => set({ sortBy: option }),
  setProducts: (data) => set({ products: data }),
  setProductQuantity: (data) => set({ quantityOption: data }),
  setSelectedProductIndex: (data) => set({ selectedProductIndex: data }),
  setFinalProductOption: (data) => set({ finalProductOption: data }),
  setQuantityAndEstimatedDate: (data) =>
    set({ selectQuantityAndEstimatedDate: data }),
  setTemplateData: (data) => set({ templateData: data }),
  setTemplateOption: (data) => set({ templateOption: data }),
  setTurnaroundTimeOption: (data) => set({ turnaroundTimeOptionData: data }),
  setQuantityOption: (data) => set({ quantityOptionData: data }),
  resetFilters: () =>
    set({
      categoryFilter: [],
      sortBy: SortByProduct.ALL,
    }),
}));
