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

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

import pytest
from playwright.sync_api import Page
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.sms_notifications_settings_tab import SMSNotificationsSettingsTab


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

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

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

        Выполняет:
        1. Авторизацию в системе
        2. Переход на вкладку настройки СМС уведомлений через панель навигации
        """
        # Авторизация в системе
        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("СМС")

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

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

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

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

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

        Проверяет:
        Заполнение наличие и заполнение поля ввода номера
        """

        expected_sms_phone = "7(111) 111-11-11"

        # Инициализация вкладки
        sms_notification_settings_tab = SMSNotificationsSettingsTab(browser)
        sms_notification_settings_tab.should_be_test_button()

        send_sms_window = sms_notification_settings_tab.click_test_button()
        send_sms_window.check_content()

        send_sms_window.input_sms_phone(expected_sms_phone)
        actual_sms_phone = send_sms_window.get_sms_phone()
        assert expected_sms_phone == actual_sms_phone, \
            f"Expected sms phone field value {expected_sms_phone} is not equal actual {actual_sms_phone}"

        send_sms_window.close_by_toolbar_button()

    # @pytest.mark.develop
    # TO-DO: rewrite tescase after feature release
    def test_send_sms_notification(self, browser: Page) -> None:
        """Тест содержимого вкладки настройки СМС уведомлений.

        Проверяет:
        Заполнение полей и отправку СМС уведомления
        """

        field_values = ["8.8.8.8", "testadmin", "test12345678"]
        # sms_phone = "7(910)123-34-40"

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

        sms_notification_settings_tab.click_edit_button()

        sms_notification_settings_tab.input_ip(field_values[0])
        ip = sms_notification_settings_tab.get_ip_setting_value()
        assert ip == field_values[0], f"Actual IP value {ip} is not equal expected value {field_values[0]}"

        sms_notification_settings_tab.input_user(field_values[1])
        user = sms_notification_settings_tab.get_user_setting_value()
        assert user == field_values[1], f"Actual user name value {user} is not equal expected value {field_values[1]}"

        sms_notification_settings_tab.input_password(field_values[2])
        password = sms_notification_settings_tab.get_password_setting_value()
        dots = password.count(".")
        assert dots > 0, "Password should be hidden"
        assert len(field_values[2]) == dots, f"Should be {dots} dots for hidden password"

        sms_notification_settings_tab.click_password_hidden_icon()
        password = sms_notification_settings_tab.get_password_setting_value()
        assert password == field_values[2], \
              f"Actual password value {password} is not equal expected value {field_values[2]}"

        # temporarily, should be rewritten
        sms_notification_settings_tab.click_cancel_button()

        sms_notification_settings_tab.should_be_test_button()

        # send_sms_window = sms_notification_settings_tab.click_test_button()
        # send_sms_window.input_sms_phone(sms_phone)

        # send_sms_window.should_be_success_alert()
