"""Модуль тестов вкладки 'Пользователи'.

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

from typing import Dict
import pytest
from playwright.sync_api import Page
from pages.users_tab import UsersTab
from pages.main_page import MainPage
from pages.login_page import LoginPage

class TestUsersTab:
    """Класс тестов для проверки вкладки 'Пользователи'."""

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

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

        lp = LoginPage(browser)
        lp.do_login()

        mp = MainPage(browser)
        mp.should_be_navigation_panel()
        mp.click_main_navigation_panel_item("Настройки")
        mp.click_configuration_navigation_panel_item("Пользователи")

    def test_users_tab_content(self, browser: Page) -> None:
        """Проверяет содержимое вкладки 'Пользователи'.

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

        ut = UsersTab(browser)
        ut.should_be_toolbar()
        ut.should_be_users_table()
        ut.check_users_table_content(True)

    def test_users_tab_toolbar_buttons(self, browser: Page) -> None:
        """Проверяет кнопки на панели инструментов.

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

        ut = UsersTab(browser)
        ut.should_be_toolbar_buttons()

    def test_add_user_window_content(self, browser: Page) -> None:
        """Проверяет содержимое окна добавления пользователя.

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

        ut = UsersTab(browser)
        ut.open_add_user_window()
        ut.check_add_user_window_content()

    def test_add_user_window_close_buttons(self, browser: Page) -> None:
        """Проверяет кнопки закрытия окна добавления.

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

        ut = UsersTab(browser)
        ut.open_add_user_window()
        ut.close_add_user_window_by_toolbar_button()

        ut.open_add_user_window()
        ut.close_add_user_window()

    def test_edit_user_window_content(self, browser: Page) -> None:
        """Проверяет содержимое окна редактирования.

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

        ut = UsersTab(browser)
        user_name, role = ut.open_edit_user_page_by_index(0)
        ut.check_edit_user_window_content(user_name, role)

    def test_edit_user_window_close_buttons(self, browser: Page) -> None:
        """Проверяет кнопки закрытия окна редактирования.

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

        ut = UsersTab(browser)
        user_name, role = ut.open_edit_user_page_by_index(0)
        ut.close_edit_user_window_by_toolbar_button(user_name)
        user_name, role = ut.open_edit_user_page_by_index(0)
        ut.close_edit_user_window(user_name)

    def test_add_and_delete_user(self, browser: Page) -> None:
        """Проверяет добавление и удаление пользователя.

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

        user_data: Dict[str, str] = {"name": "User", "role": "Администратор", "password": "987654"}

        mp = MainPage(browser)
        ut = UsersTab(browser)

        ut.open_add_user_window()
        ut.add_new_user(user_data)
        mp.click_configuration_navigation_panel_item("Пользователи")
        mp.click_configuration_navigation_panel_item("Пользователи")
        ut.should_be_user_in_table(user_data["name"], user_data["role"])
        ut.open_edit_user_page_by_user(user_data["name"], user_data["role"])
        ut.delete_user(user_data["name"])
        mp.click_configuration_navigation_panel_item("Пользователи")
        mp.click_configuration_navigation_panel_item("Пользователи")
        ut.should_not_be_user_in_table(user_data["name"], user_data["role"])

    def test_reset_password(self, browser: Page) -> None:
        """Проверяет сброс пароля пользователя.

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

        user_data: Dict[str, str] = {"name": "autoadmin", "role": "Администратор", "password": "123456"}

        mp = MainPage(browser)
        ut = UsersTab(browser)

        ut.open_add_user_window()
        ut.add_new_user(user_data)
        mp.click_configuration_navigation_panel_item("Пользователи")
        mp.click_configuration_navigation_panel_item("Пользователи")
        ut.open_edit_user_page_by_user(user_data["name"], user_data["role"])
        new_password = ut.reset_password(user_data["name"])

        if len(new_password) == 0:
            assert False, "Unsuccessful password reset"

        new_lp = LoginPage(browser)
        new_lp.do_login(username=user_data["name"], password=new_password)
        new_mp = MainPage(browser)
        new_mp.do_logout()
        lp_1 = LoginPage(browser)
        lp_1.do_login()
        mp_1 = MainPage(browser)
        mp_1.should_be_navigation_panel()
        mp_1.click_main_navigation_panel_item("Настройки")
        mp_1.click_configuration_navigation_panel_item("Пользователи")
        ut_1 = UsersTab(browser)
        ut_1.open_edit_user_page_by_user(user_data["name"], user_data["role"])
        ut_1.delete_user(user_data["name"])
        mp_1.click_configuration_navigation_panel_item("Пользователи")
        mp_1.click_configuration_navigation_panel_item("Пользователи")
        ut_1.should_not_be_user_in_table(user_data["name"], user_data["role"])

    def test_edit_user_role(self, browser: Page) -> None:
        """Проверяет изменение роли пользователя.

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

        user_data: Dict[str, str] = {"name": "autooperator", "role": "Оператор", "password": "123245"}

        mp = MainPage(browser)
        ut = UsersTab(browser)

        ut.open_add_user_window()
        ut.add_new_user(user_data)
        mp.click_configuration_navigation_panel_item("Пользователи")
        mp.click_configuration_navigation_panel_item("Пользователи")
        ut.open_edit_user_page_by_user(user_data["name"], user_data["role"])
        new_user_data = {"role": "Контактное лицо"}
        ut.edit_user(user_data["name"], new_user_data)
        mp.click_configuration_navigation_panel_item("Пользователи")
        mp.click_configuration_navigation_panel_item("Пользователи")
        ut.should_be_user_in_table(user_data["name"], new_user_data["role"])
        ut.open_edit_user_page_by_user(user_data["name"], new_user_data["role"])
        ut.delete_user(user_data["name"])
        mp.click_configuration_navigation_panel_item("Пользователи")
        mp.click_configuration_navigation_panel_item("Пользователи")
        ut.should_not_be_user_in_table(user_data["name"], new_user_data["role"])
