"""Шаблон патча

Здесь вы можете добавить описание патча, его назначение и другие детали.

Каждый патч должен независеть от других патчей и проверять себя при применении. Он не должен вернуть True, если есть проблемы.
На данный момент каждый патч должен иметь функцию `apply`, которая принимает на вход конфигурацию и возвращает True или False.
И модель `Config`, которая наследуется от `PatchTemplate` (поле `enabled` добавлять не нужно).
Это позволяет упростить конфигурирование и проверять типы данных, и делать значения по умолчанию.
При успешном применении патча, функция apply должна вернуть True, иначе False.
Ошибка будет интерпретирована как False. С выводом ошибки в консоль.
Ещё патч должен иметь переменную `priority`, которая указывает приоритет патча, чем выше, тем раньше он будет применен.

Коротко о конфигурации. Она состоит из двух частей `config` (на основе модели `Config` и из файла `configs/название_патча.json`).
И постоянной не типизированной переменной `base` из `config.json` и флага `verbose`.
```
python ./main.py build --verbose
```

В конце docstring может быть дополнительное описание конфигурации патча (основное описание получается из модели `Config`).
Это может быть как короткий фрагмент из названия патча и одной опции "enabled", которая обрабатывается в коде патчера.

"todo_template": {
    "enabled": true, // Пример описания тк этот текст просто пример
    "example": true  // Пример кастомного параметра
}
"""

__author__ = "wowlikon <wowlikon@gmail.com>"
__version__ = "1.0.0"
from typing import Any, Dict, List

from pydantic import Field
from tqdm import tqdm

from utils.config import PatchTemplate


class Patch(PatchTemplate):
    example: bool = Field(True, description="Пример кастомного параметра")

    def apply(
        self, base: Dict[str, Any]
    ) -> bool:  # Анотации типов для удобства, читаемости и поддержки IDE
        priority: int = Field(
            frozen=True, exclude=True, default=0
        )  # Приоритет патча, чем выше, тем раньше он будет применен
        tqdm.write("Вывод информации через tqdm, чтобы не мешать прогресс-бару")
        tqdm.write("Пример включен" if self.example else "Пример отключен")
        if base["verbose"]:
            tqdm.write(
                "Для вывода подробной и отладочной информации используйте флаг --verbose"
            )
        return True
