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

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

import pytest
from playwright.sync_api import Page, expect
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.email_notifications_settings_tab import EmailNotificationsSettingsTab


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

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

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

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

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

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

        current_settings = {}
        default_settings = {}

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

        # запрос текущих установок
        cur_settings_response = email_notification_settings_tab.send_get_api_request("e-cmdb/api/email_notifier")
        if cur_settings_response.status == 200:
            response_body = email_notification_settings_tab.get_response_body(cur_settings_response)

            if response_body:
                current_settings = response_body[0].copy()

        # запрос дефолтных значений
        default_settings_response = email_notification_settings_tab. \
                                    send_get_api_request("e-cmdb/api/email_notifier/meta")
        if default_settings_response.status == 200:
            response_body = email_notification_settings_tab.get_response_body(default_settings_response)

            if response_body:
                default_settings = response_body["fields"].copy()

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

        # Получение и проверка отображаемых входных значений формы настроек 'Общие'
        common_settings = email_notification_settings_tab.get_common_settings_values()
        value = common_settings["Сервер"]
        expected = current_settings["smtp_host"]
        if expected is None:
            expected = self._get_default_value("smtp_host", default_settings)
        assert value == expected, f"Actual value {value} is not equal expected {expected} for field 'Сервер'"

        value = common_settings["Порт"]
        expected = current_settings["smtp_port"]
        if expected is None:
            expected = self._get_default_value("smtp_port", default_settings)
        assert value == expected, f"Actual value {value} is not equal expected {expected} for field 'Порт'"

        value = common_settings["Отправитель"]
        expected = current_settings["from_email"]
        if expected is None:
            expected = self._get_default_value("from_email", default_settings)
        assert value == expected, f"Actual value {value} is not equal expected {expected} for field 'Отправитель'"

        # Получение и проверка отображаемых входных значений формы настроек 'TLS'
        value = email_notification_settings_tab.get_tls_tunnel_setting_value()
        expected = current_settings["secure"]
        if expected is None:
            expected = self._get_default_value("secure", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Использовать TLS-туннель'"

        # Получение и проверка отображаемых входных значений формы настроек 'Аутентификация'
        auth_settings = email_notification_settings_tab.get_auth_settings_values()
        value = auth_settings["Метод авторизации"]
        expected = current_settings["auth_method"]
        if expected is None:
            expected = self._get_default_value("auth_method", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Метод авторизации'"

        value = auth_settings["Имя пользователя"]
        expected = current_settings["login"]
        if expected is None:
            expected = self._get_default_value("login", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Имя пользователя'"

        value = auth_settings["Пароль"]
        expected = current_settings["password"]
        if expected is None:
            expected = self._get_default_value("password", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Пароль'"

        value = auth_settings["Домен"]
        expected = current_settings["domain"]
        if expected is None:
            expected = self._get_default_value("domain", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Домен'"

        value = auth_settings["Рабочая станция"]
        expected = current_settings["workstation"]
        if expected is None:
            expected = self._get_default_value("workstation", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Рабочая станция'"

    def test_send_test_email_window_content(self, browser: Page) -> None:
        """Тест модального окна для посылки тестового E-mail.

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

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

        send_test_email_window = email_notification_settings_tab.click_test_button()
        send_test_email_window.check_content()

        send_test_email_window.close()

        send_test_email_window = email_notification_settings_tab.click_test_button()
        send_test_email_window.close_by_toolbar_button()

    # @pytest.mark.develop
    # TO-DO: rewrite tescase after feature release
    def test_send_test_email(self, browser: Page) -> None:
        """Тест модального окна для посылки тестового E-mail.

        Проверяет:
        Возможность посылки тестового E-mail.
        """
        # Адрес куда отправлять e-mail
        # Пока фейковый
        fake_address = "test@grandpas_village.com"

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

        # Заполнить поля настройки
        # TO-DO after feature release

        send_test_email_window = email_notification_settings_tab.click_test_button()

        send_test_email_window.input_email(fake_address)
        
        with browser.expect_response("**/e-nms/email/testEmail") as response_info:
            send_test_email_window.click_test_button()
            send_test_email_window.should_be_success_alert()
        
        response = response_info.value
        assert response.ok, "Unsuccessful test e-mail request"

        send_test_email_window.close()

    def _get_default_value(self, setting_name: str, default_settings: dict) -> str| None:
        for setting in default_settings:
            if setting["name"] == setting_name:
                return setting["default"]
        return None
