import { create } from "zustand";
import * as api from "../api/client";
import useCommandLogStore from "./useCommandLogStore";

const useProductStore = create((set, get) => ({
  // State
  products: [],
  loading: false,
  error: null,
  scraping: {}, // { [productId]: true } pour les produits en cours de scraping

  // Actions
  fetchProducts: async () => {
    set({ loading: true, error: null });
    useCommandLogStore.getState().logInfo("Chargement des produits...");
    try {
      const products = await api.fetchProducts();
      set({ products, loading: false });
      useCommandLogStore.getState().logSuccess(`${products.length} produits chargés`);
    } catch (err) {
      set({ error: err.message, loading: false });
      useCommandLogStore.getState().logError(`Erreur: ${err.message}`);
    }
  },

  addProduct: async (data) => {
    set({ loading: true, error: null });
    useCommandLogStore.getState().logInfo("Ajout du produit...");
    try {
      const newProduct = await api.createProduct(data);
      // Rafraîchir la liste complète pour avoir les données enrichies (ProductWithSnapshot)
      await get().fetchProducts();
      set({ loading: false });
      useCommandLogStore.getState().logSuccess(`Produit ajouté: ${newProduct.titre || newProduct.asin}`);
      return newProduct;
    } catch (err) {
      set({ error: err.message, loading: false });
      useCommandLogStore.getState().logError(`Erreur ajout: ${err.message}`);
      throw err;
    }
  },

  deleteProduct: async (id) => {
    set({ error: null });
    useCommandLogStore.getState().logInfo(`Suppression du produit #${id}...`);
    try {
      await api.deleteProduct(id);
      set((state) => ({
        products: state.products.filter((p) => p.id !== id),
      }));
      useCommandLogStore.getState().logSuccess(`Produit #${id} supprimé`);
    } catch (err) {
      set({ error: err.message });
      useCommandLogStore.getState().logError(`Erreur suppression: ${err.message}`);
      throw err;
    }
  },

  scrapeProduct: async (id) => {
    const product = get().products.find((p) => p.id === id);
    const productName = product?.titre?.substring(0, 30) || `#${id}`;
    set((state) => ({
      scraping: { ...state.scraping, [id]: true },
      error: null,
    }));
    useCommandLogStore.getState().logInfo(`Scraping: ${productName}...`);
    try {
      const result = await api.scrapeProduct(id);
      // Refresh la liste pour avoir les nouvelles données
      await get().fetchProducts();
      set((state) => {
        const { [id]: _, ...rest } = state.scraping;
        return { scraping: rest };
      });
      const status = result.status === "success" ? "logSuccess" : "logWarning";
      useCommandLogStore.getState()[status](`Scrape ${productName}: ${result.status}`);
      return result;
    } catch (err) {
      set((state) => {
        const { [id]: _, ...rest } = state.scraping;
        return { scraping: rest, error: err.message };
      });
      useCommandLogStore.getState().logError(`Erreur scrape: ${err.message}`);
      throw err;
    }
  },

  scrapeAll: async () => {
    set({ loading: true, error: null });
    useCommandLogStore.getState().logInfo("Scraping de tous les produits...");
    try {
      const result = await api.scrapeAll();
      await get().fetchProducts();
      set({ loading: false });
      useCommandLogStore.getState().logSuccess(
        `Scrape terminé: ${result.success}/${result.total} réussis`
      );
      return result;
    } catch (err) {
      set({ error: err.message, loading: false });
      useCommandLogStore.getState().logError(`Erreur scrape all: ${err.message}`);
      throw err;
    }
  },

  updateProduct: async (id, data) => {
    set({ error: null });
    useCommandLogStore.getState().logInfo(`Mise à jour produit #${id}...`);
    try {
      await api.updateProduct(id, data);
      // Rafraîchir la liste pour avoir les données mises à jour
      await get().fetchProducts();
      useCommandLogStore.getState().logSuccess(`Produit #${id} mis à jour`);
    } catch (err) {
      set({ error: err.message });
      useCommandLogStore.getState().logError(`Erreur mise à jour: ${err.message}`);
      throw err;
    }
  },

  clearError: () => set({ error: null }),
}));

export default useProductStore;
