"""Модуль modal_send_test_email содержит класс для работы с модальным окном для посылки тестового E-mail на
базе настроек вкладки 'Уведомления/E-mail'.

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

from playwright.sync_api import Page
from tools.logger import get_logger
from locators.modal_window_locators import ModalWindowLocators
from elements.text_input_element import TextInput
from components.modal_window_component import ModalWindowComponent
from components.alert_component import AlertComponent

logger = get_logger("SEND_TEST_EMAIL_MODAL_WINDOW")


class SendTestEmailModalWindow(ModalWindowComponent):
    """Модальное окно для посылки тестового E-mail.

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

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


        window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)

        self.window_title_locator = window_locator.locator("//div[@class='v-toolbar__title']")
        self.add_toolbar_title("Тест")

        # Настройка кнопки закрытия
        toolbar_button_close_locator = window_locator.locator("//button[@data-testid='E_MAIL_CARD__btn__close']")
        self.add_toolbar_button(toolbar_button_close_locator, "close")

        # Поле ввода адреса
        loc = window_locator.locator("//input[@data-testid='E_MAIL_CARD__text-field_text__email']")
        email_input = TextInput(page, loc, "email_input")
        self.add_content_item("email_input", email_input)

        # Добавление кнопок действий
        locator_button_test = window_locator.locator("//button[@data-testid='E_MAIL_CARD__footer_btn__test']")
        self.add_button(locator_button_test, "test_button")

        locator_button_close = window_locator.locator("//button[@data-testid='E_MAIL_CARD__footer_btn__close']")
        self.add_button(locator_button_close, "close_button")

        self.alert = AlertComponent(page)

    # Действия:
    def close_by_toolbar_button(self):
        """Закрывает окно кнопкой на тулбаре."""

        self.click_toolbar_close_button()

    def close(self):
        """Закрывает окно кнопкой на 'Закрыть'."""

        close_button = self.get_button_by_name("close_button")
        close_button.click()

    def click_test_button(self):
        """Отсылка письма по указанному адресу нажатием кнопки 'Тест'."""

        close_button = self.get_button_by_name("test_button")
        close_button.click()

    def input_email(self, address: str) -> None:
        """Заполнение поля 'E-MAIL'."""

        email_input_field = self.get_content_item("email_input")
        email_input_field.clear()
        email_input_field.input_value(address)

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

        self.check_by_window_title()
        self.check_toolbar_button_visibility("close")
        self.check_toolbar_button_tooltip("close", "Закрыть")

        email_input_field = self.get_content_item("email_input")
        email_input_field.check_visibility("E-mail input field is missing")
        email_input_field.check_editable_input("E-mail input field should be editable")


        self.check_button_visibility("test_button")
        self.check_button_visibility("close_button")

    def should_be_success_alert(self) -> None:
        """Проверяет наличие сообщения об успешной отправке тестового сообщения.

        Raises:
            AssertionError: Если тулбар отсутствует.
        """

        alert_type = self.alert.get_alert_type()
        assert alert_type == "success", f"Expected success alert, but got {alert_type} alert"

        self.alert.check_alert_presence('\nТестовое сообщение\nотправлено\n')
        self.alert.check_alert_absence('\nТестовое сообщение\nотправлено\n')
