import React from "react";
import { vi } from "vitest";
import type { Product, CartItem, Review, Order } from "../../types";

export type ShopState = {
  products: Product[];
  cart: CartItem[];
  reviews: Review[];
  orders: Order[];
  loading: boolean;
  isAuthenticated: boolean;
  addToCart: (product: Product & { selectedColor?: string | null; selectedSize?: string | null }) => void;
  removeFromCart: (productId: string, selectedColor?: string | null, selectedSize?: string | null) => void;
  updateQuantity: (productId: string, quantity: number, selectedColor?: string | null, selectedSize?: string | null) => void;
  clearCart: () => void;
  submitOrder: (customer: Order["customer"], shippingMethod: string) => Promise<void>;
  submitReview: (review: Omit<Review, "id" | "status" | "date">) => Promise<void>;
  refreshReviews: () => Promise<void>;
};

const createDefaultState = (): ShopState => ({
  products: [],
  cart: [],
  reviews: [],
  orders: [],
  loading: false,
  isAuthenticated: false,
  addToCart: vi.fn(),
  removeFromCart: vi.fn(),
  updateQuantity: vi.fn(),
  clearCart: vi.fn(),
  submitOrder: vi.fn().mockResolvedValue(undefined),
  submitReview: vi.fn().mockResolvedValue(undefined),
  refreshReviews: vi.fn().mockResolvedValue(undefined),
});

let state: ShopState = createDefaultState();

export const __setShopState = (partial: Partial<ShopState>) => {
  state = { ...state, ...partial };
};

export const __resetShopState = () => {
  state = createDefaultState();
};

export const useShop = () => state;

export const ShopProvider: React.FC<React.PropsWithChildren> = ({ children }) =>
  React.createElement(React.Fragment, null, children);
