"""Модуль вкладки настройки Push уведомлений.

Содержит класс PushNotificationsSettings для работы с вкладкой настройки Push уведомлений.
Позволяет проверять состояние и взаимодействовать с элементами вкладки.
"""

import re
from playwright.sync_api import Page
from locators.settings_form_locators import SettingsFormLocators
from elements.text_input_element import TextInput
from elements.text_element import Text
from components.toolbar_component import ToolbarComponent
from components.alert_component import AlertComponent
from components_derived.settings_form_component import SettingsFormComponent
from components_derived.interactive_dropdown_list import InteractiveDropdownList
from pages.base_page import BasePage


class PushNotificationsSettingsTab(BasePage):
    """Класс для работы с вкладкой настройки Push уведомлений.

    Предоставляет методы для взаимодействия с вкладкой настройки Push уведомлений.

    Args:
        page: Экземпляр страницы Playwright.
    """

    def __init__(self, page: Page) -> None:
        """Инициализирует компоненты вкладки настройки Push уведомлений."""

        super().__init__(page)


        self.toolbar = ToolbarComponent(page, "Push уведомления")

        # Форма для отображения/редактирования полей настроек Push уведомлений
        self.settings_form = SettingsFormComponent(page)
        self.settings_form.add_toolbar_title("Общие")

        message_setting_label = Text(page,
                                   page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                   get_by_text('Сообщение'),
                                   "message_setting_label")
        self.settings_form.add_content_item("message_setting_label", message_setting_label)

        loc_message_input = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                            get_by_label('Сообщение').nth(1)
        message_setting_input = TextInput(page, loc_message_input, "message_setting_input")
        self.settings_form.add_content_item("message_setting_input", message_setting_input)

        users_settings_locator = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                 get_by_label('Пользователи')
        users_setting_label = Text(page, users_settings_locator, "users_setting_label")
        self.settings_form.add_content_item("users_setting_label", users_setting_label)

        users_setting_input = TextInput(page,
                                        page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                        get_by_role("combobox"),
                                        "users_setting_input")
        self.settings_form.add_content_item("users_setting_input", users_setting_input)
        self.settings_form.add_content_item("users_list", InteractiveDropdownList(page))

        self.settings_form.add_tooltip_button(page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                              get_by_role("button", name='Отправить'),
                                              "submit_button")

        self.alert = AlertComponent(page)

    # Действия:
    def clear_users_setting_value(self) -> None:
        """Очищает текущее значение поля настроек 'Пользователи'."""

        selected_users = self.get_users_setting_value()
        if len(selected_users) > 0:
            clear_selection_button = self.page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                       get_by_role("combobox").locator(SettingsFormLocators.CLEAR_SELECTION_BUTTON)
            clear_selection_button.click()

    def click_submit_button(self) -> None:
        """Нажатие кнопки 'Отправить' в форме ввода настроек."""

        self.settings_form.check_button_visibility("submit_button")
        self.settings_form.get_button_by_name("submit_button").click()

    def get_message_setting_value(self) -> str:
        """Возвращает текущее значение поля настроек 'Сообщение'.

        Returns:
           str : Текущее значение поля настроек 'Сообщение'.
        """

        input_field = self.settings_form.get_content_item("message_setting_input")
        return input_field.get_input_value().strip()

    def get_users_setting_value(self) -> str:
        """Возвращает текущее значение поля настроек 'Пользователи'.

        Returns:
           str : Текущее значение поля настроек 'Пользователи'.
        """

        users_setting_field_loc = self.page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                   get_by_role("combobox").locator(SettingsFormLocators.SELECTED_VALUES)

        return users_setting_field_loc.text_content().strip()

    def input_message(self, text: str) -> None:
        """Заполнение поля 'Сообщение'."""

        message_input = self.settings_form.get_content_item("message_setting_input")
        message_input.clear()
        message_input.input_value(text)

    def deselect_users(self, users: list[str]) -> None:
        """Изменение значения поля 'Пользователи' путем отмены выбора из выпадающего списка заданных имен."""

        assert len(users) != 0, "Users list should not be empty"

        self.settings_form.get_content_item("users_setting_input").click()
        users_list = self.settings_form.get_content_item("users_list")

        for user in users:
            users_list.deselect_item_with_text(user)

        # Закрываем выпадающий список (кликаем вне его)
        self.page.mouse.click(10, 10)

    def select_users(self, users: list[str]) -> None:
        """Заполнение поля 'Пользователи' путем выбора из выпадающего списка заданных имен."""

        assert len(users) != 0, "Users list should not be empty"

        self.settings_form.get_content_item("users_setting_input").click()
        users_list = self.settings_form.get_content_item("users_list")

        for user in users:
            users_list.select_item_with_text(user)

        # Закрываем выпадающий список (кликаем вне его)
        self.page.mouse.click(10, 10)

    # Проверки:
    def check_content(self):
        """Проверяет наличие и корректность всех элементов страницы."""

        self.should_be_toolbar()

        self.should_be_form_toolbar()

        for name in self.settings_form.content_items.keys():
            if name == "users_list":
                self.settings_form.get_content_item("users_setting_input").click()
                users_list = self.settings_form.get_content_item(name)
                selected_users = users_list.get_selected_items(SettingsFormLocators.DROPDOWN_LIST)
                assert len(selected_users) == 0, "There should be no selected users"
            else:
                item = self.settings_form.get_content_item(name)
                item.check_visibility(
                    f"Push notifications settings input form item with name '{name}' is missing"
                )

        self.settings_form.check_button_visibility("submit_button")
        self.settings_form.check_button_tooltip("submit_button", "Отправить Push уведомление")

    def should_be_toolbar(self) -> None:
        """Проверяет наличие тулбара страницы.

        Raises:
            AssertionError: Если тулбар или кнопка редактирования отсутствуют.
        """
        loc = self.page.get_by_role("navigation").filter(
              has_text=re.compile("Push уведомления")).locator("div").nth(1)
        self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar with title 'Push уведомления' is missing")

    def should_be_form_toolbar(self) -> None:
        """Проверяет наличие тулбара формы редактирования настроек.

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

        self.settings_form.should_be_toolbar()

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

        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('\nPush-уведомление\nуспешно отправлено\n')
        self.alert.check_alert_absence('\nPush-уведомление\nуспешно отправлено\n')
