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

РАЗДЕЛИТЕЛЬ_ПАР = "___,,,___"
РАЗДЕЛИТЕЛЬ_КЛЮЧЕЙ_ОТ_ЗНАЧЕНИЙ = "___:::___"

def записать_в_файл(путь: str, текст: str) -> str:
    with open(путь, "w", encoding='utf-8') as file:
        file.write(текст)

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

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

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

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

    return список_словарей

if __name__ == "__main__":
    # Windws разбивает путь на разные папки с помощью дроби \
    # Питон воспринимает этот символ как "специальный" и ожидает после него дополнительный специальный символ
    # Поэтому если просто скопировать путь фйла виндоуса в файл питона, питон вылетит с ошибкой
    # чтобы этого не допустить надо:
    #   1) либо проставить двойные дроби \\ вместо одинарных \
    #   2) либо проставить перед ковычками букву "r", но тогда не получиться использовать "f" строку

    путь = "C:\\Users\\user\\Desktop\\python\\one\\подключаемый_модуль\\Worzis_tools\\файл из питона.txt"
#    текст = "этот текст"
#
#    записать_в_файл(путь, "этот текст")
#    текст_из_файла = считать_из_файла(путь, текст)
#    print(текст_из_файла == текст)




    список_словарей = [{
        "имя": "Никита",
        "фамилия": "Тарасов",
        "должность": "Преподаватель",
        "возраст": "35"
    }, {
        "имя": "Даниил",
        "фамилия": "Махов",
        "должность": "Уборщик",
        "возраст": "19"
    }]
    
    записать_словари_в_файл(путь, список_словарей)
    результат = считать_словари_из_файла(путь)
    print(результат == список_словарей)