from pages.login_page import LoginPage
from pages.main_page import MainPage
from pages.session_tab import SessionsTab
from pages.users_tab import UsersTab

import pytest


class TestSessionsTab:
    """Набор тестов для вкладки 'Сеансы'.

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

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

        Выполняет:
        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_configuration_navigation_panel_item("Обслуживание и диагностика")
        main_page.click_maintenance_navigation_panel_item("Сеансы")
    
    def test_sessions_tab_content(self, browser):
        """Тест содержимого вкладки 'Сеансы'.

        Проверяет:
        1. Наличие и корректность тулбара
        2. Наличие таблицы сеансов
        3. Соответствие содержимого таблицы данным из БД
        """
        # Инициализация страницы сеансов
        sessions_tab = SessionsTab(browser)

        # Проверка элементов интерфейса
        sessions_tab.should_be_toolbar()
        sessions_tab.should_be_sessions_table()
        
        # Проверка содержимого таблицы с верификацией данных из БД
        sessions_tab.check_sessions_table_content(verify=True)

    def test_sessions_table_row_highlighting(self, browser):
        """Тест содержимого вкладки 'Сеансы'.

        Проверяет:
        1. Наличие таблицы сеансов
        2. Проверка подсветки строки при наведении на нее курсором
        """
        # Инициализация страницы сеансов
        sessions_tab = SessionsTab(browser)

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

        # Получение количества строк в таблице без учета заголовка
        rows_count = sessions_tab.get_rows_count()
        
        # Проверка подсветки первой строки
        sessions_tab.check_sessions_table_row_highlighting(0)
        
        # Проверка подсветки последней строки строки (если в таблице более одной строки)
        if rows_count > 1:
            sessions_tab.check_sessions_table_row_highlighting(rows_count - 1)

    def test_delete_session_confirm_window(self, browser):
        """Тест содержимого вкладки 'Сеансы'.

        Проверяет:
        1. Наличие таблицы сеансов
        2. Проверка контента и возможности горизонтального скроллинга окна подтверждения удаления сессии
        """
        
        # Инициализация страницы сеансов
        sessions_tab = SessionsTab(browser)

        # Проверка элементов интерфейса
        sessions_tab.should_be_sessions_table()
        
        # Проверка контента и скроллинга окна подтверждения удаления сессии
        sessions_tab.check_delete_session_confirm_window()       
 
    #@pytest.mark.develop
    def test_session_for_new_user(self, browser):
        """Тест содержимого вкладки 'Сеансы'.

        Проверяет:
        1. Создание нового пользователя
        2. Вход нового пользователя в систему
        3. Проверка наличия сессии нового пользователя
        4. Выход нового пользователя из системы (logout)
        5. Вход в систему первоначального пользователя
        6. Проверка отсутствия сессии нового пользователя
        7. Удаление нового пользователя
        """
        user_data = {"name": "NewUser", "role": "Администратор", "password": "qwerty"}

        mp = MainPage(browser)
        ut = UsersTab(browser)
        
        # Создание нового пользователя
        mp.click_configuration_navigation_panel_item("Пользователи")
        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"])
        
        # Вход в систему для нового пользователя
        new_lp = LoginPage(browser)
        new_lp.do_login(username=user_data["name"], password=user_data["password"])
        
        # Инициализация главной страницы
        new_mp = MainPage(browser)
        
        # Открыть вкладку Сессии
        new_mp.should_be_navigation_panel()
        new_mp.click_main_navigation_panel_item("Настройки")
        new_mp.click_configuration_navigation_panel_item("Обслуживание и диагностика")
        new_mp.click_maintenance_navigation_panel_item("Сеансы")
        
        # Инициализация страницы сеансов
        st = SessionsTab(browser)

        # Проверка элементов интерфейса
        st.should_be_sessions_table()
        
        # Проверка наличия записи о сессии текущего пользователя
        session_token = st.get_session_token()
        st.should_be_session_in_table(session_token)
        
        # logout
        new_mp.do_logout()
        
        # Авторизация в системе предыдущего пользователя
        prev_lp = LoginPage(browser)
        prev_lp.do_login()
        
        # Инициализация главной страницы
        prev_mp = MainPage(browser)
        
        # Открыть вкладку Сессии
        prev_mp.should_be_navigation_panel()
        prev_mp.click_main_navigation_panel_item("Настройки")
        prev_mp.click_configuration_navigation_panel_item("Обслуживание и диагностика")
        prev_mp.click_maintenance_navigation_panel_item("Сеансы")
        
        # Проверка элементов интерфейса
        st.should_be_sessions_table()
        
        # Проверка отсутствия записи о сессии созданного пользователя после выхода из системы
        st.should_not_be_session_in_table(session_token)
        
        # Удаление созданного пользователя
        prev_ut = UsersTab(browser)
        prev_ut.open_edit_user_page_by_user(user_data["name"], user_data["role"])
        prev_ut.delete_user(user_data["name"])
