import { ref, computed } from 'vue' import { useApi } from './useApi' import { useToast } from './useToast' const pieceModelsBuckets = ref({}) const loadingPieceModels = ref(false) export function usePieceModels() { const { get, post, patch, delete: del } = useApi() const { showSuccess, showError } = useToast() const loadPieceModels = async (typePieceId) => { loadingPieceModels.value = true try { const query = typePieceId ? `?typePieceId=${encodeURIComponent(typePieceId)}` : '' const result = await get(`/types/pieces/models${query}`) if (result.success) { const key = typePieceId || '__all__' pieceModelsBuckets.value = { ...pieceModelsBuckets.value, [key]: result.data, } } return result } catch (error) { showError(`Impossible de charger les modèles de pièce: ${error.message}`) return { success: false, error: error.message } } finally { loadingPieceModels.value = false } } const createPieceModel = async (payload) => { loadingPieceModels.value = true try { const result = await post('/types/pieces/models', payload) if (result.success) { const key = result.data?.typePieceId || '__all__' const bucket = pieceModelsBuckets.value[key] || [] pieceModelsBuckets.value = { ...pieceModelsBuckets.value, [key]: [...bucket, result.data], } showSuccess(`Modèle de pièce "${result.data.name}" créé`) } return result } catch (error) { showError(`Erreur lors de la création du modèle de pièce: ${error.message}`) return { success: false, error: error.message } } finally { loadingPieceModels.value = false } } const updatePieceModel = async (id, payload) => { loadingPieceModels.value = true try { const result = await patch(`/types/pieces/models/${id}`, payload) if (result.success) { const key = result.data?.typePieceId || '__all__' const bucket = pieceModelsBuckets.value[key] || [] const updatedBucket = bucket.map((model) => model.id === id ? result.data : model ) pieceModelsBuckets.value = { ...pieceModelsBuckets.value, [key]: updatedBucket, } showSuccess(`Modèle de pièce "${result.data.name}" mis à jour`) } return result } catch (error) { showError(`Erreur lors de la mise à jour du modèle de pièce: ${error.message}`) return { success: false, error: error.message } } finally { loadingPieceModels.value = false } } const deletePieceModel = async (id) => { loadingPieceModels.value = true try { const result = await del(`/types/pieces/models/${id}`) if (result.success) { const updatedBuckets = {} for (const [key, bucket] of Object.entries(pieceModelsBuckets.value)) { updatedBuckets[key] = bucket.filter((model) => model.id !== id) } pieceModelsBuckets.value = updatedBuckets showSuccess('Modèle de pièce supprimé') } return result } catch (error) { showError(`Erreur lors de la suppression du modèle de pièce: ${error.message}`) return { success: false, error: error.message } } finally { loadingPieceModels.value = false } } const allPieceModels = computed(() => { return Object.values(pieceModelsBuckets.value).reduce((acc, bucket) => { bucket.forEach((model) => { if (!acc.find((existing) => existing.id === model.id)) { acc.push(model) } }) return acc }, []) }) const getPieceModelsForType = (typePieceId) => { return pieceModelsBuckets.value[typePieceId] || [] } const getPieceModels = () => allPieceModels.value const isPieceModelLoading = () => loadingPieceModels.value return { pieceModels: allPieceModels, pieceModelsBuckets, loadingPieceModels, loadPieceModels, createPieceModel, updatePieceModel, deletePieceModel, getPieceModels, getPieceModelsForType, isPieceModelLoading, } }