"""Модуль тестов вкладки настройки LDAP Аутентификации.

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

import pytest
from playwright.sync_api import Page
from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.ldap_settings_tab import LDAPAuthSettingsTab


# @pytest.mark.smoke
class TestLDAPAuthSettingsTab:
    """Набор тестов для вкладки настройки LDAP Аутентификации.

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

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

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

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

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

        current_settings = {}
        default_settings = {}

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

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

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

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

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

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

        # Получение и проверка отображаемых входных значений формы настроек
        settings = ldap_auth_settings_tab.get_current_setting_values()

        value = settings["ip"]
        expected = current_settings["ip"]
        if expected is None:
            expected = self._get_default_value("ip", default_settings)
        assert value == expected, f"Actual value {value} is not equal expected {expected} for field 'IP'"

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

        value = 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 = 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 = 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 = settings["DN каталог пользователей"]
        expected = current_settings["base_dn"]
        if expected is None:
            expected = self._get_default_value("base_dn", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'DN каталог пользователей'"

        value = settings["Атрибут авторизации"]
        expected = current_settings["login_attribute"]
        if expected is None:
            expected = self._get_default_value("login_attribute", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Атрибут авторизации'"

        value = settings["Атрибут email"]
        expected = current_settings["email_attribute"]
        if expected is None:
            expected = self._get_default_value("email_attribute", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Атрибут email'"

        value = settings["Атрибут sms"]
        expected = current_settings["sms_attribute"]
        if expected is None:
            expected = self._get_default_value("sms_attribute", default_settings)
        assert value == expected, \
               f"Actual value {value} is not equal expected {expected} for field 'Атрибут sms'"


    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
