from .проверка_элементов import содержит
from .терминал import печать

РАЗДЕЛИТЕЛЬ_ПАР="___туеимнокцудеои526гз5ш42670з95826щшозг___"
РАЗДЕЛИТЕЛЬ_КЛЮЧА_ОТ_ЗНАЧЕНИЯ = "___63473673567/*/*/*635/7*396___"
def записать_в_файл(путь, текст):
    with open(путь, "w", encoding="utf-8") as file:
        file.write(текст)
    # r - чтение
    # w - запись
    # a - добавление

def считать_из_файла(путь):
    with open(путь, "r", encoding="utf-8") as file:
        return file.read()

def преобразовать_словарь_в_текст(словарь: dict):
    # если разделитель встречается в одном из значений словаря, то выдать ошибку "В одном из значений словаря содержится ошибка"
    if содержит(
        что=[РАЗДЕЛИТЕЛЬ_КЛЮЧА_ОТ_ЗНАЧЕНИЯ, РАЗДЕЛИТЕЛЬ_ПАР],
        где=list(словарь.values())
    ):
        raise ValueError(печать("В одном из значений словаря найден разделитель",
                         красный=True,
                         не_печатать=True
        ))
    результат = ""
    for ключ, значение in словарь.items():
        пара_в_тексте = f"{ключ}{РАЗДЕЛИТЕЛЬ_КЛЮЧА_ОТ_ЗНАЧЕНИЯ}{значение}"
        результат+=пара_в_тексте + РАЗДЕЛИТЕЛЬ_ПАР
    результат=результат[:-len(РАЗДЕЛИТЕЛЬ_ПАР)]
    return результат

def записать_словари_в_файл(путь: str, список_словарей: list) -> None:
    общий_результат = ""
    for словарь in список_словарей:
        результат = преобразовать_словарь_в_текст(словарь)
        общий_результат+=результат + "\n"
        # "\n"  - спец символ, означающий завершение абзаца
        # всё, что будет написано после него - будет написано с новой строки
    записать_в_файл(путь, общий_результат)

def считать_словари_из_файла(путь: str) -> list:
    текст=считать_из_файла(путь)
    список_словарей = []
    for строка in текст.splitlines():
        пары = строка.split(РАЗДЕЛИТЕЛЬ_ПАР)
        словарь = {}
        for пара in пары:
            ключ, значение = пара.split(РАЗДЕЛИТЕЛЬ_КЛЮЧА_ОТ_ЗНАЧЕНИЯ)
            словарь[ключ] = значение
        список_словарей.append(словарь)
    return список_словарей

if __name__ == "__main__":
    # windows разбивает путь к файлу на разные папки с помощью дроби \
    # питон воспринимает этот символ как специальный и ожидает после него дополнительный специпльный символ
    # поэтому если просто скопировать путь виндоуса в файл питона, будет ошибка
    # чтобы этого не допустить надо:
        # либо проставить везде двойные дроби \\ вместо одинарных \ 
        # либо до кавычки поставить букву "r", но тогда не получиться использовать f-строку
    путь = "C:\\Users\\2024.09 Пайтон\\Desktop\\ученики\\РухлядаПолина\\programm_ucheba\\подключаемый модуль\\инструменты\\файл из питона.txt"
    текст = "текст написан в питоне 21.01.25"
    # записать_в_файл(путь, текст)
    # текст_из_файла = считать_из_файла(путь)
    # print(текст_из_файла == текст)

    список_словарей = [{
        "имя" : "Ни___:___кита",
        "фамилия" : "Тарасов",
        "должность" : "Преподаватель",
        "возраст" : "35"
    }, {
        "имя" : "Игорь",
        "фамилия" : "Чай",
        "должность" : "Дворник",
        "возраст" : "58"
    }]
    записать_словари_в_файл(путь, список_словарей)
    результат = считать_словари_из_файла(путь)
    print(результат == список_словарей)