import {api} from "./api";
import {requests} from "../../requests";
import {getComparator} from "../../components/core/getComparator";

class IngredientClient {

    allList(currentId, setIngredients, setIngredient, createError) {
        api().get(requests.ingredient.all)
            .then((r) => {
                const arr = r.data.sort(getComparator("asc", "name"));
                setIngredients(arr)

                if (!currentId) {
                    return;
                }
                const currentIngredient = arr.find((r) => r.id === (currentId * 1));
                if (!currentIngredient) {
                    return;
                }
                setIngredient(currentIngredient);
            })
            .catch(() => createError("Ошибка получения данных"))
    }

    getType(setTypes) {
        api().get(requests.ingredient.type)
            .then((r) => setTypes(r.data.sort(getComparator("asc", "name"))))
    }

    findAll(setIngredients, createError) {
        api().get(requests.ingredient.all)
            .then((r) => setIngredients(r.data.sort(getComparator("asc", "name"))))
            .catch(() => createError("Ошибка получения списка ингредиентов"))
    }

    getAllIngredients(setIngredients, setLoading, createError) {
        api().get(requests.ingredient.all)
            .then((r) => {
                setIngredients(r.data)
                setLoading(false);
            })
            .catch(() => {
                createError("Ошибка получения списка ингредиентов");
                setLoading(false);
            })
    }

    changeIngredientIsHave(id, value, state, setIngredients, createError) {
        const url = `${requests.ingredient.crud}?id=${id}`;
        const request = value ? api().put(url) : api().delete(url);
        request
            .then(() => {
                setIngredients(state);
            })
            .catch(() => {
                createError("Ошибка изменения ингредиента");
            });
    }

    deleteIngredientIsHave(id, createSuccess, createError) {
        api().delete(`${requests.ingredient.crud}/${id}`)
            .then(() => createSuccess("Ингредиент удален"))
            .catch(() => createError("Ошибка удаления ингредиента. Перезагрузите страницу"))
    }

    saveIngredient(ingredient, createSuccess, createError) {
        api().patch(requests.ingredient.crud, ingredient)
            .then(() => createSuccess("Ингредиент сохранен"))
            .catch(() => createError("Ошибка сохранения"))
    }

    findOne(id, selectIngredient, createError) {
        api().get(`${requests.bar.ingredient}?id=${id}`)
            .then((r) => {
                selectIngredient(r.data)
            })
            .catch(() => createError("Ошибка получения информации об ингредиенте"))
    }

    changeIngredientInBar(ingredient, cocktail, setCocktail, createSuccess, createError) {
        const url = `${requests.ingredient.crud}?id=${ingredient.id}`;
        const request = ingredient.isHave ? api().delete(url) : api().put(url);
        const value = !ingredient.isHave;
        request.then(() => {
            const newReceipts = cocktail.receipt.map((r) => {
                if (r.ingredient.id !== ingredient.id) {
                    return r;
                }
                return {
                    ...r,
                    ingredient: {
                        ...ingredient,
                        isHave: value
                    }
                }
            })
            setCocktail({
                ...cocktail,
                receipt: newReceipts
            })
            createSuccess("Сохранено")
        }).catch(() => createError("Ошибка сохранения"))
    }

    findUnit(setUnits, createError) {
        api().get(requests.unit)
            .then((r) => setUnits(r.data.sort(getComparator("asc", "name"))))
            .catch(() => createError("Ошибка получения единиц измерения"))
    }
}

export const ingredientClient = new IngredientClient()