#include <iostream>
#include <vector>
#include <string>

struct Book {
    std::string title;
    std::string author;
    std::string publisher;
    std::string genre;
};

std::vector<Book> library;

void addBook(const Book& book) {
    library.push_back(book);
}

void editBook(int index, const Book& newBook) {
    if (index >= 0 && index < library.size()) {
        library[index] = newBook;
    } else {
        std::cout << "Неверный индекс книги." << std::endl;
    }
}

void printBooks() {
    for (const auto& book : library) {
        std::cout << "Название: " << book.title << ", Автор: " << book.author << ", Издательство: " << book.publisher << ", Жанр: " << book.genre << std::endl;
    }
}

std::vector<Book> searchByAuthor(const std::string& author) {
    std::vector<Book> result;
    for (const auto& book : library) {
        if (book.author == author) {
            result.push_back(book);
        }
    }
    return result;
}

Book searchByTitle(const std::string& title) {
    for (const auto& book : library) {
        if (book.title == title) {
            return book;
        }
    }
    return {"", "", "", ""};
}

void sortByTitle() {
    for (size_t i = 0; i < library.size() - 1; ++i) {
        for (size_t j = 0; j < library.size() - i - 1; ++j) {
            if (library[j].title > library[j + 1].title) {
                std::swap(library[j], library[j + 1]);
            }
        }
    }
}

void sortByAuthor() {
    for (size_t i = 0; i < library.size() - 1; ++i) {
        for (size_t j = 0; j < library.size() - i - 1; ++j) {
            if (library[j].author > library[j + 1].author) {
                std::swap(library[j], library[j + 1]);
            }
        }
    }
}

void sortByPublisher() {
    for (size_t i = 0; i < library.size() - 1; ++i) {
        for (size_t j = 0; j < library.size() - i - 1; ++j) {
            if (library[j].publisher > library[j + 1].publisher) {
                std::swap(library[j], library[j + 1]);
            }
        }
    }
}

void printMenu() {
    std::cout << "Меню:" << std::endl;
    std::cout << "1. Добавить книгу" << std::endl;
    std::cout << "2. Редактировать книгу" << std::endl;
    std::cout << "3. Печать всех книг" << std::endl;
    std::cout << "4. Поиск книг по автору" << std::endl;
    std::cout << "5. Поиск книги по названию" << std::endl;
    std::cout << "6. Сортировка по названию" << std::endl;
    std::cout << "7. Сортировка по автору" << std::endl;
    std::cout << "8. Сортировка по издательству" << std::endl;
    std::cout << "9. Выход" << std::endl;
}

int main() {
    // Добавление начальных книг
    addBook({"1984", "George Orwell", "Secker & Warburg", "Dystopian"});
    addBook({"To Kill a Mockingbird", "Harper Lee", "J.B. Lippincott & Co.", "Fiction"});
    addBook({"The Great Gatsby", "F. Scott Fitzgerald", "Charles Scribner's Sons", "Tragedy"});
    addBook({"Moby-Dick", "Herman Melville", "Harper & Brothers", "Adventure"});
    addBook({"War and Peace", "Leo Tolstoy", "The Russian Messenger", "Historical"});
    addBook({"Pride and Prejudice", "Jane Austen", "T. Egerton", "Romance"});
    addBook({"The Catcher in the Rye", "J.D. Salinger", "Little, Brown and Company", "Fiction"});
    addBook({"The Hobbit", "J.R.R. Tolkien", "George Allen & Unwin", "Fantasy"});
    addBook({"The Lord of the Rings", "J.R.R. Tolkien", "George Allen & Unwin", "Fantasy"});
    addBook({"The Alchemist", "Paulo Coelho", "HarperTorch", "Fiction"});

    int choice;
    std::string title, author, publisher, genre;
    int index;

    while (true) {
        printMenu();
        std::cout << "Выберите действие: ";
        std::cin >> choice;

        if (choice == 1) {
            std::cout << "Введите название: ";
            std::cin.ignore();
            std::getline(std::cin, title);
            std::cout << "Введите автора: ";
            std::getline(std::cin, author);
            std::cout << "Введите издательство: ";
            std::getline(std::cin, publisher);
            std::cout << "Введите жанр: ";
            std::getline(std::cin, genre);
            addBook({title, author, publisher, genre});
        } else if (choice == 2) {
            std::cout << "Введите индекс книги для редактирования: ";
            std::cin >> index;
            std::cout << "Введите новое название: ";
            std::cin.ignore();
            std::getline(std::cin, title);
            std::cout << "Введите нового автора: ";
            std::getline(std::cin, author);
            std::cout << "Введите новое издательство: ";
            std::getline(std::cin, publisher);
            std::cout << "Введите новый жанр: ";
            std::getline(std::cin, genre);
            editBook(index, {title, author, publisher, genre});
        } else if (choice == 3) {
            printBooks();
        } else if (choice == 4) {
            std::cout << "Введите автора для поиска: ";
            std::cin.ignore();
            std::getline(std::cin, author);
            std::vector<Book> results = searchByAuthor(author);
            for (const auto& book : results) {
                std::cout << "Найдено: " << book.title << std::endl;
            }
        } else if (choice == 5) {
            std::cout << "Введите название для поиска: ";
            std::cin.ignore();
            std::getline(std::cin, title);
            Book book = searchByTitle(title);
            if (book.title != "") {
                std::cout << "Найдено: " << book.title << std::endl;
            } else {
                std::cout << "Книга не найдена." << std::endl;
            }
        } else if (choice == 6) {
            sortByTitle();
            std::cout << "Книги отсортированы по названию." << std::endl;
        } else if (choice == 7) {
            sortByAuthor();
            std::cout << "Книги отсортированы по автору." << std::endl;
        } else if (choice == 8) {
            sortByPublisher();
            std::cout << "Книги отсортированы по издательству." << std::endl;
        } else if (choice == 9) {
            break;
        } else {
            std::cout << "Неверный выбор. Пожалуйста, попробуйте снова." << std::endl;
        }
    }

    return 0;
}

