// модуль для работы с REST API сервера

// адрес сервера
const serverUrl = "http://localhost:8081";

// обращение к серверу для получения всех типов авторов (get)
export async function getAllAuthors() {
    const response = await fetch(`${serverUrl}/authors`);
    if (!response.ok) {
        throw response.statusText;
    }
    return response.json();
}

// обращение к серверу для получения всех категорий книг (get)
export async function getAllCategories() {
    const response = await fetch(`${serverUrl}/categories`);
    if (!response.ok) {
        throw response.statusText;
    }
    return response.json();
}

// обращение к серверу для получения всех записей (get)
export async function getAllBooks() {
    const response = await fetch(`${serverUrl}/books?_expand=categories&_expand=authors`);
    if (!response.ok) {
        throw response.statusText;
    }
    return response.json();
}

// обращение к серверу для получения записи по первичному ключу (id) (get)
// id передается в качестве части пути URL get-запроса
export async function getBook(id) {
    const response = await fetch(`${serverUrl}/books/${id}?_expand=categories&_expand=authors`);
    if (!response.ok) {
        throw response.statusText;
    }
    return response.json();
}

// обращение к серверу для создания записи (post)
// объект отправляется в теле запроса (body)
export async function addBook(categoriesId, name, authorsId, year, image) {
    const itemObject = createBookObject(categoriesId, name, authorsId, year, image);

    const options = {
        method: "POST",
        body: JSON.stringify(itemObject),
        headers: {
            "Accept": "application/json",
            "Content-Type": "application/json",
        },
    };

    const response = await fetch(`${serverUrl}/books`, options);
    if (!response.ok) {
        throw response.statusText;
    }
    return response.json();
}

// обращение к серверу для обновления записи по id (put)
// объект отправляется в теле запроса (body)
// id передается в качестве части пути URL get-запроса
export async function updateBook(id, categoriesId, name, authorsId, year, image) {
    const itemObject = createBookObject(categoriesId, name, authorsId, year, image);

    const options = {
        method: "PUT",
        body: JSON.stringify(itemObject),
        headers: {
            "Accept": "application/json",
            "Content-Type": "application/json",
        },
    };

    const response = await fetch(`${serverUrl}/books/${id}`, options);
    if (!response.ok) {
        throw response.statusText;
    }
    return response.json();
}

// обращение к серверу для удаления записи по id (delete)
// id передается в качестве части пути URL get-запроса
export async function deleteLine(id) {
    const options = {
        method: "DELETE",
    };

    const response = await fetch(`${serverUrl}/books/${id}`, options);
    if (!response.ok) {
        throw response.statusText;
    }
    return response.json();
}

// функция возвращает объект нужной структуры для отправки на сервер
function createBookObject(categoriesId, name, authorsId, year, image) {
    return {
        categoriesId,
        authorsId,
        name,
        year,
        image,
    };
}