import { AddressModal } from "@/lib/types/models/address";
import { create } from "zustand";

type AddressState = {
  addressList: AddressModal[];
  billingIndex: number;
  billingAddress: AddressModal;
  selectedAddressIndex: number;
  viewShowModal: boolean;
  showModal: boolean;
  deliveryMethod: string;
  addressType: string;
  selectedCartItemIndex: number;
  isLoading: boolean;
  error: string | null;
  editAddress: AddressModal | null;
};

type AddressActions = {
  setAddress: (data: AddressModal[]) => void;
  setBillingIndex: (val: number) => void;
  setBillingAddress: (data: AddressModal) => void;
  setSelectedAddressIndex: (val: number) => void;
  setViewShowModal: (val: boolean) => void;
  setShowModal: (val: boolean) => void;
  setDeliveryMethod: (data: string) => void;
  setAddressType: (data: string) => void;
  setSelectedCartItemIndex: (val: number) => void;
  setLoading: (loading: boolean) => void;
  setError: (error: string | null) => void;
  setEditAddress: (data: AddressModal | null) => void;
};

export const useAddressStore = create<AddressState & AddressActions>((set) => ({
  // Initial state
  addressList: [],
  billingIndex: -1,
  billingAddress: {} as AddressModal,
  selectedAddressIndex: -1,
  viewShowModal: false,
  showModal: false,
  deliveryMethod: "shipping",
  addressType: "",
  selectedCartItemIndex: -1,
  isLoading: false,
  error: null,
  editAddress: null,

  // Actions
  setAddress: (data) => set({ addressList: data }),
  setBillingIndex: (data) => set({ billingIndex: data }),
  setBillingAddress: (data) => set({ billingAddress: data }),
  setSelectedAddressIndex: (data) => set({ selectedAddressIndex: data }),
  setViewShowModal: (data) => set({ viewShowModal: data }),
  setShowModal: (data) => set({ showModal: data }),
  setDeliveryMethod: (data) => set({ deliveryMethod: data }),
  setAddressType: (data) => set({ addressType: data }),
  setSelectedCartItemIndex: (data) => set({ selectedCartItemIndex: data }),
  setLoading: (loading) => set({ isLoading: loading }),
  setError: (error) => set({ error }),
  setEditAddress: (data) => set({ editAddress: data }),
}));
