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

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

import pytest
from playwright.sync_api import Page
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.push_notifications_settings_tab import PushNotificationsSettingsTab


# @pytest.mark.smoke
class TestPushNotificationsSettingsTab:
    """Набор тестов для вкладки настройки Push уведомлений.

    Проверяет корректность отображения и функциональность элементов вкладки настройки Push уведомлений.

    Тесты покрывают следующие сценарии:
    1. test_session_settings_tab_content: Тест содержимого вкладки настройки Push уведомлений

    """

    @pytest.fixture(scope="function", autouse=True)
    def setup(self, browser: Page) -> None:
        """Фикстура для подготовки тестового окружения.

        Выполняет:
        1. Авторизацию в системе
        2. Переход на вкладку настройки Push уведомлений через панель навигации
        """
        # Авторизация в системе
        login_page = LoginPage(browser)
        login_page.do_login()

        # Инициализация главной страницы
        main_page = MainPage(browser)

        # Проверка и взаимодействие с элементами навигации
        main_page.should_be_navigation_panel()
        main_page.click_main_navigation_panel_item("Настройки")
        main_page.click_subpanel_item("Уведомления")
        main_page.click_subpanel_item("Push уведомления")

   # @pytest.mark.develop
    def test_push_notifications_settings_tab_content(self, browser: Page) -> None:
        """Тест содержимого вкладки настройки Push уведомлений.

        Проверяет:
        Наличие и корректность элементов интерфейса
        """
        expected_msg_value = "test"

        # Инициализация вкладки
        push_notification_settings_tab = PushNotificationsSettingsTab(browser)

        # Проверка элементов интерфейса
        push_notification_settings_tab.check_content()

        msg_value = push_notification_settings_tab.get_message_setting_value()
        assert msg_value == expected_msg_value, \
        f"Actual message field value {msg_value} is not equal expected message field value {expected_msg_value}"

    # @pytest.mark.develop
    def test_send_push_notification(self, browser: Page) -> None:
        """Тест содержимого вкладки настройки Push уведомлений.

        Проверяет:
        Заполнение полей и отправку Push уведомления
        """
        receivers = ["admin", "manager", "operator"]

        # Инициализация вкладки
        push_notification_settings_tab = PushNotificationsSettingsTab(browser)

        expected_msg_value = "My test message"
        push_notification_settings_tab.input_message(expected_msg_value)
        msg_value = push_notification_settings_tab.get_message_setting_value()
        assert msg_value == expected_msg_value, \
        f"Actual message field value {msg_value} is not equal expected message field value {expected_msg_value}"

        push_notification_settings_tab.select_users(receivers)

        sep = ", "
        expected_users = sep.join(receivers)
        selected_users = push_notification_settings_tab.get_users_setting_value()
        assert selected_users == expected_users, \
        f"Actual users field value {selected_users} is not equal expected users field value {expected_users}"

        push_notification_settings_tab.click_submit_button()
        push_notification_settings_tab.should_be_success_alert()

    # @pytest.mark.develop
    def test_users_setting_input(self, browser: Page) -> None:
        """Тест содержимого вкладки настройки Push уведомлений.

        Проверяет:
        Заполнение и очистку поля 'Пользователи'
        """
        receivers = ["manager", "operator", "collector"]
        sep = ", "

        # Инициализация вкладки
        push_notification_settings_tab = PushNotificationsSettingsTab(browser)

        push_notification_settings_tab.select_users(receivers)

        expected_users = sep.join(receivers)
        selected_users = push_notification_settings_tab.get_users_setting_value()
        assert selected_users == expected_users, \
        f"Actual users field value {selected_users} is not equal expected users field value {expected_users}"

        receivers.remove("collector")
        push_notification_settings_tab.deselect_users(["collector"])

        expected_users = sep.join(receivers)
        selected_users = push_notification_settings_tab.get_users_setting_value()
        assert selected_users == expected_users, \
        f"Actual users field value {selected_users} is not equal expected users field value {expected_users}"

        push_notification_settings_tab.clear_users_setting_value()
        selected_users = push_notification_settings_tab.get_users_setting_value()
        assert len(selected_users) == 0, "There should be no selected users"
