"""Модуль modal_view_template содержит класс для работы с модальным окном шаблона.

Класс ViewTemplateModalWindow наследует базовый функционал ModalWindowComponent
и реализует методы просмотра модального окна шаблона.
"""

import re
from playwright.sync_api import Page
from tools.logger import get_logger
from components.modal_window_component import ModalWindowComponent
from components.json_container_component import JsonContainerComponent
from locators.json_container_locators import JsonContainerLocators


logger = get_logger("VIEW_TEMPLATE_MODAL_WINDOW")


class ViewTemplateModalWindow(ModalWindowComponent):
    """Модальное окно шаблона.

    Наследует ModalWindowComponent и добавляет функционал для:
    1. Инициализации модального окна с конкретным шаблоном
    2. Закрытия модального окна через тулбар
    3. Проверки содержимого модального окна
    4. Проверки содержимого JSON контейнера
    """

    def __init__(self, page: Page, title: str):
        """Инициализирует элементы формы модального окна шаблона."""
        super().__init__(page)

        # Настройка заголовка и кнопки закрытия
        self.window_title = title
        locator_button_toolbar_close = self.page.get_by_role("navigation").filter(
            has_text=re.compile(self.window_title)
        ).get_by_role("button")

        self.add_toolbar_title(self.window_title)
        self.add_toolbar_button(locator_button_toolbar_close, "close")

        # Инициализация JSON контейнера
        self.json_container = JsonContainerComponent(page)

    def close_window_by_toolbar_button(self):
        """Закрывает окно через кнопку в тулбаре."""
        self.click_toolbar_close_button()

    def check_content(self) -> None:
        """Проверяет наличие и корректность элементов окна.

        Проверяет:
        1. Наличие заголовка окна с именем шаблона
        2. Видимость кнопки закрытия
        3. Подсказку кнопки закрытия
        """
        self.check_by_window_title()
        self.check_toolbar_button_visibility("close")
        self.check_toolbar_button_tooltip("close", "Закрыть")

    def verify_json_container_content(self, template_data: dict) -> None:
        """Проверяет соответствие данных контейнера данным из API.

        Args:
            template_data: Данные шаблона из API.
        """
        # Читаем данные из контейнера
        actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)

        # Сравниваем actual_data с данными конкретного шаблона
        self.json_container.check_json_equals(
            actual_data,
            template_data,
            "Expected json content is not equal actual:"
        )
