Загрузка данных


def load_menu_txt():
    try:
        with open('menu.txt', 'r', encoding='utf-8') as f:
            lines = f.readlines()
    except FileNotFoundError:
        print("Ошибка! Файл menu.txt не найден!")
        exit()
    menu_data = []
    current_category = None
    current_dishes = []
    for line in lines:
        line = line.strip()
        if not line:
            continue
        if '|' in line:
            name, weight, price = line.split('|')
            current_dishes.append({name: [int(weight), float(price)]})
        else:
            if current_category:
                menu_data.append({current_category: current_dishes})
                current_dishes = []
            current_category = line
    if current_category:
        menu_data.append({current_category: current_dishes})
    return menu_data


def save_menu_txt(pervoe, vtoroe, salati, deserti):
    with open('menu.txt', 'w', encoding='utf-8') as f:
        f.write("ПЕРВЫЕ БЛЮДА\n")
        for dish in pervoe:
            for name, props in dish.items():
                f.write(f"{name}|{props[0]}|{props[1]}\n")
        f.write("\nВТОРЫЕ БЛЮДА\n")
        for dish in vtoroe:
            for name, props in dish.items():
                f.write(f"{name}|{props[0]}|{props[1]}\n")
        f.write("\nСАЛАТЫ\n")
        for dish in salati:
            for name, props in dish.items():
                f.write(f"{name}|{props[0]}|{props[1]}\n")
        f.write("\nДЕСЕРТЫ\n")
        for dish in deserti:
            for name, props in dish.items():
                f.write(f"{name}|{props[0]}|{props[1]}\n")
        for kategoriya in menu:
            for nazvanie_kategorii, blyuda in kategoriya.items():
                if nazvanie_kategorii not in ['ПЕРВЫЕ БЛЮДА', 'ВТОРЫЕ БЛЮДА', 'САЛАТЫ', 'ДЕСЕРТЫ']:
                    if blyuda:
                        f.write(f"\n{nazvanie_kategorii}\n")
                        for blyudo in blyuda:
                            for imya_blyuda, harakteristiki in blyudo.items():
                                f.write(f"{imya_blyuda}|{harakteristiki[0]}|{harakteristiki[1]}\n")


def poisk():
    try:
        with open('menu.txt', 'r', encoding='utf-8') as f:
            lines = f.readlines()
    except FileNotFoundError:
        print("Ошибка! Файл menu.txt не найден!")
        return
    print("\nПоиск:")
    print("1. По названию")
    print("2. По категории")
    print("3. По цене")
    try:
        choice = int(input("Выберите способ поиска: "))
    except ValueError:
        print("Ошибка! Введите число")
        return
    menu_data = {}
    current_category = None
    for line in lines:
        line = line.strip()
        if not line:
            continue
        if '|' not in line and line.isupper():
            current_category = line
            menu_data[current_category] = []
        elif '|' in line and current_category:
            parts = line.split('|')
            if len(parts) == 3:
                name, weight, price = parts
                menu_data[current_category].append({'Название': name,'Вес': int(weight),'Цена': float(price) })
    if choice == 1:
        search_name = input("Введите название блюда (или его часть): ").lower()
        found = False
        print("\nРезультаты поиска:")
        for category, dishes in menu_data.items():
            for dish in dishes:
                if search_name in dish['Название'].lower():
                    print(f"{category}: {dish['Название']} - {dish['Вес']}г, {dish['Цена']}руб")
                    found = True
        if not found:
            print("Блюда с таким названием не найдены!")
    elif choice == 2:
        print("\nДоступные категории:")
        categories = list(menu_data.keys())
        for idx, cat in enumerate(categories, 1):
            print(f"{idx}. {cat}")
        try:
            cat_choice = int(input("Выберите номер категории: "))
            if 1 <= cat_choice <= len(categories):
                cat_name = categories[cat_choice - 1]
                if len(menu_data[cat_name]) > 0:
                    print(f"\nБлюда в категории '{cat_name}':")
                    for dish in menu_data[cat_name]:
                        print(f"{dish['Название']} - {dish['Вес']}г, {dish['Цена']}руб")
                else:
                    print(f"В категории '{cat_name}' нет блюд!")
            else:
                print("Неверная категория!")
        except ValueError:
            print("Ошибка! Введите число")
    elif choice == 3:
        try:
            price = float(input("Введите цену для поиска: "))
            found = False
            print(f"\nБлюда с ценой {price}руб:")
            for category, dishes in menu_data.items():
                for dish in dishes:
                    if dish['Цена'] == price:
                        print(f"{category}: {dish['Название']} - {dish['Вес']}г, {dish['Цена']}руб")
                        found = True
            if not found:
                print(f"Блюд с ценой {price}руб не найдено!")
        except ValueError:
            print("Ошибка! Введите корректную цену")
    else:
        print("Неверный выбор!")


def oplata(obshaya_summa):
    while True:
        try:
            print("Выберите способ оплаты:\n1. Наличными\n2. По карте\n3. По QR-коду")
            sposob = int(input("Ваш выбор:"))
            if sposob == 1:
                while True:
                    try:
                        nalichnie = float(input("Укажите какую сумму внесёте наличными:"))
                        if nalichnie <= 0:
                            print("Ошибка! Внесённая сумма должна быть положительной")
                        elif nalichnie > 0:
                            if nalichnie == obshaya_summa:
                                print("Оплата прошла успешно! Ждём Вас снова.")
                                return
                            elif nalichnie < obshaya_summa:
                                print(
                                    f"Не хватает {obshaya_summa - nalichnie} для оплаты. Попробуйте изменить способ оплаты.")
                                break
                            elif nalichnie > obshaya_summa:
                                print(
                                    f"Оплата прошла успешно! Ваша сдача: {nalichnie - obshaya_summa}. Ждём Вас снова.")
                                return
                    except ValueError:
                        print("Ошибка ввода суммы!")
            elif sposob == 2:
                print("Для оплаты поднесите карту к терминалу.")
                print("Производится оплата")
                print("Оплата прошла успешно! Ждём Вас снова.")
                return
            elif sposob == 3:
                print("Для оплаты отсканируйте QR-код на терминале.")
                print("Производится оплата")
                print("Оплата прошла успешно! Ждём Вас снова.")
                return
        except ValueError:
            print("Ошибка выбора оплаты! Попробуйте снова.")
menu = load_menu_txt()
pervoe = []
vtoroe = []
salati = []
deserti = []
for category in menu:
    for category_name, dishes in category.items():
        if category_name == 'ПЕРВЫЕ БЛЮДА':
            pervoe = dishes
        elif category_name == 'ВТОРЫЕ БЛЮДА':
            vtoroe = dishes
        elif category_name == 'САЛАТЫ':
            salati = dishes
        elif category_name == 'ДЕСЕРТЫ':
            deserti = dishes


def udalenie():
    global pervoe, vtoroe, salati, deserti, menu
    n = 1
    for i in menu:
        for key in i:
            print(f"{n}.{key}", end=" ")
            n += 1
    print()
    try:
        answer = int(input("\nВыберите категорию, из которой хотите удалить блюдо: "))
    except ValueError:
        print("Ошибка! Введите число")
        return
    if 1 <= answer <= len(menu):
        n = 0
        for i in menu:
            for key in i:
                n += 1
                if n == answer:
                    spisok = i[key]
                    nazvanie = key
                    break
            if n == answer:
                break
    else:
        print("Неверная категория!")
        return
    n = 1
    for dish in spisok:
        for key in dish:
            print(f"{n}.{key}", end=" ")
            n += 1
    print()
    try:
        num = int(input("\nВыберите номер блюда для удаления: "))
        if 1 <= num <= len(spisok):
            del spisok[num - 1]
            if nazvanie == 'ПЕРВЫЕ БЛЮДА':
                pervoe = spisok
            elif nazvanie == 'ВТОРЫЕ БЛЮДА':
                vtoroe = spisok
            elif nazvanie == 'САЛАТЫ':
                salati = spisok
            elif nazvanie == 'ДЕСЕРТЫ':
                deserti = spisok
            save_menu_txt(pervoe, vtoroe, salati, deserti)
            print("Блюдо удалено!")
        else:
            print("Неверный номер!")
    except ValueError:
        print("Ошибка! Введите число")


def pokazat_menu():
    print("\nМеню")
    for category in menu:
        for category_name, dishes in category.items():
            print(f"{category_name}:")
            if dishes:
                for dish in dishes:
                    for name, details in dish.items():
                        print(f"  {name}: {details[0]}г, {details[1]}руб")
            else:
                print("  (пусто)")
    print()


def pokazat_kategorii():
    n = 1
    for i in menu:
        for key in i:
            print(f"{n}.{key}", end=" ")
            n += 1
    print()


def izmenit_blyudo():
    global pervoe, vtoroe, salati, deserti, menu
    pokazat_kategorii()
    try:
        vibor = int(input("\nВыберите номер категории: "))
    except ValueError:
        print("Ошибка! Введите число")
        return
    if 1 <= vibor <= len(menu):
        selected_category = list(menu[vibor - 1].keys())[0]
        dishes_list = menu[vibor - 1][selected_category]
        if len(dishes_list) == 0:
            print(f"В категории '{selected_category}' нет блюд!")
            return
        print(f"\nДоступные блюда в категории '{selected_category}':")
        for idx, dish in enumerate(dishes_list, 1):
            for name, details in dish.items():
                print(f"{idx}. {name} - {details[0]}г, {details[1]}руб")
        try:
            num = int(input("Выберите номер блюда для изменения: "))
            if 1 <= num <= len(dishes_list):
                dish = dishes_list[num - 1]
                old_name = list(dish.keys())[0]
                print(f"Изменение блюда '{old_name}'")
                new_name = input("Введите новое название (оставьте пустым для сохранения): ").strip()
                if new_name:
                    dish[new_name] = dish.pop(old_name)
                    old_name = new_name
                try:
                    new_weight = input("Введите новый вес (грамм, оставьте пустым для сохранения): ").strip()
                    if new_weight:
                        new_weight = int(new_weight)
                        if new_weight < 1:
                            raise ValueError()
                        dish[old_name][0] = new_weight
                    new_price = input("Введите новую цену (руб, оставьте пустым для сохранения): ").strip()
                    if new_price:
                        new_price = float(new_price)
                        if new_price < 0:
                            raise ValueError()
                        dish[old_name][1] = new_price
                except ValueError:
                    print("Ошибка! Вес и цена должны быть положительными числами")
                    return
                if selected_category == 'ПЕРВЫЕ БЛЮДА':
                    pervoe = dishes_list
                elif selected_category == 'ВТОРЫЕ БЛЮДА':
                    vtoroe = dishes_list
                elif selected_category == 'САЛАТЫ':
                    salati = dishes_list
                elif selected_category == 'ДЕСЕРТЫ':
                    deserti = dishes_list
                save_menu_txt(pervoe, vtoroe, salati, deserti)
                print(f"Блюдо '{old_name}' изменено!")
            else:
                print("Неверный номер!")
        except ValueError:
            print("Ошибка! Введите число")
    else:
        print("Неверная категория!")


def main():
    global pervoe, vtoroe, salati, deserti, menu
    while True:
        print("\nРесторан 'ИДИ Кушать'")
        try:
            vibor = int(input("Кто вы?\n1. Гость\n2. Администратор\n3. Выйти из программы\nВыберите: "))
        except ValueError:
            print("Ошибка! Введите число 1, 2 или 3")
            continue
        if vibor == 1:
            zakaz = []
            obshaya_summa = 0
            while True:
                print("\nОформление заказа")
                print("1. Показать меню")
                print("2. Добавить блюдо в заказ")
                print("3. Поиск блюда")
                print("4. Показать текущий заказ")
                print("5. Оформить заказ и перейти к оплате")
                print("6. Отменить заказ и выйти")
                try:
                    choice = int(input("Выберите действие: "))
                except ValueError:
                    print("Ошибка! Введите число от 1 до 5")
                    continue
                if choice == 1:
                    pokazat_menu()
                elif choice == 2:
                    print("\nВыберите категорию:")
                    pokazat_kategorii()
                    try:
                        kat = int(input("Выберите номер категории: "))
                    except ValueError:
                        print("Ошибка! Введите число")
                        continue
                    if 1 <= kat <= len(menu):
                        selected_category = list(menu[kat - 1].keys())[0]
                        dishes_list = menu[kat - 1][selected_category]
                        if len(dishes_list) == 0:
                            print(f"В категории '{selected_category}' нет блюд!")
                            continue
                        print(f"\nДоступные блюда в категории '{selected_category}':")
                        for idx, dish in enumerate(dishes_list, 1):
                            for name, details in dish.items():
                                print(f"{idx}. {name} - {details[0]}г, {details[1]}руб")
                        try:
                            num = int(input("Выберите номер блюда: "))
                            if 1 <= num <= len(dishes_list):
                                dish_name = list(dishes_list[num - 1].keys())[0]
                                dish_price = dishes_list[num - 1][dish_name][1]
                                zakaz.append(dishes_list[num - 1])
                                obshaya_summa += dish_price
                                print(f"Добавлено: {dish_name} (цена: {dish_price}руб)")
                            else:
                                print("Неверный номер!")
                        except ValueError:
                            print("Ошибка! Введите число")
                    else:
                        print("Неверная категория!")
                elif choice == 3:
                    poisk()
                elif choice == 4:
                    if len(zakaz) == 0:
                        print("Заказ пуст!")
                    else:
                        print("\nВаш заказ")
                        for dish in zakaz:
                            for key, value in dish.items():
                                print(f"{key}: {value[0]}г, {value[1]}руб")
                        print(f"Итого к оплате: {obshaya_summa}руб")
                elif choice == 5:
                    if len(zakaz) == 0:
                        print("Заказ пуст! Добавьте блюда.")
                    else:
                        print("\nЧек")
                        for dish in zakaz:
                            for key, value in dish.items():
                                print(f"{key}: {value[0]}г, {value[1]}руб")
                        print(f"Итого к оплате: {obshaya_summa}руб")
                        oplata(obshaya_summa)
                        break
                elif choice == 6:
                    print("Заказ отменен. До свидания!")
                    break
                else:
                    print("Неверный выбор! Введите число от 1 до 5")
        elif vibor == 2:
            try:
                parol = input("Введите пароль администратора: ")
                if parol != "admin":
                    print("Неверный пароль! Доступ запрещен.")
                    continue
            except ValueError:
                print("Ошибка ввода пароля!")
                continue
            print("Добро пожаловать, администратор!")
            while True:
                print("\nМеню администратора")
                print("1. Вывести меню")
                print("2. Записать блюдо в меню")
                print("3. Добавить новую категорию")
                print("4. Удалить блюдо")
                print("5. Изменить блюдо")
                print("6. Выйти")
                try:
                    vibor1 = int(input("Выберите действие: "))
                except ValueError:
                    print("Ошибка! Введите число 1-5")
                    continue
                if vibor1 == 1:
                    pokazat_menu()
                elif vibor1 == 2:
                    pokazat_kategorii()
                    try:
                        vibor = int(input("\nВыберите номер категории: "))
                    except ValueError:
                        print("Ошибка! Введите число")
                        continue
                    if 1 <= vibor <= len(menu):
                        selected_category = list(menu[vibor - 1].keys())[0]
                        dishes_list = menu[vibor - 1][selected_category]
                        name = input("Введите название блюда: ")
                        while True:
                            try:
                                ves = int(input("Введите вес блюда (грамм): "))
                                if ves < 1:
                                    raise ValueError()
                                cena = float(input("Введите стоимость блюда (руб): "))
                                if cena<0:
                                    raise ValueError()
                                dishes_list.append({name: [ves, cena]})
                                break
                            except ValueError:
                                print("Ошибка! Значения веса блюда и его цены должны быть положительными числами")
                                continue
                        if selected_category == 'ПЕРВЫЕ БЛЮДА':
                            pervoe = dishes_list
                        elif selected_category == 'ВТОРЫЕ БЛЮДА':
                            vtoroe = dishes_list
                        elif selected_category == 'САЛАТЫ':
                            salati = dishes_list
                        elif selected_category == 'ДЕСЕРТЫ':
                            deserti = dishes_list
                        save_menu_txt(pervoe, vtoroe, salati, deserti)
                        print(f"Блюдо добавлено в '{selected_category}'!")
                    else:
                        print("Неверная категория!")
                elif vibor1 == 3:
                    name_category = input("Введите название новой категории: ").strip()
                    not_new = False
                    for cat in menu:
                        if name_category in cat:
                            not_new = True
                            break
                    if not_new:
                        print("Такая категория уже существует!")
                    else:
                        menu.append({name_category.upper(): []})
                        print(f"Категория '{name_category}' добавлена!")
                        save_menu_txt(pervoe, vtoroe, salati, deserti)
                elif vibor1 == 4:
                    udalenie()
                elif vibor1 == 5:
                    izmenit_blyudo()
                elif vibor1 == 6:
                    break
                else:
                    print("Неверный выбор! Введите число 1-5")
        elif vibor == 3:
            print("До свидания!")
            break
        else:
            print("Неверный выбор! Введите 1, 2 или 3")


if __name__ == "__main__":
    main()