"""Модуль pages содержит фикстуры и функции для работы с Playwright.

Предоставляет инструменты для управления браузером, контекстами и страницами
в тестах pytest, включая настройку параметров запуска.
"""

import ast
import pytest
from playwright.sync_api import Browser, BrowserContext, Page, sync_playwright, Playwright
from _pytest.config.argparsing import Parser
from _pytest.fixtures import FixtureRequest


def pytest_addoption(parser: Parser):
    """Добавляет опции командной строки для настройки браузера.

    Args:
        parser: Парсер pytest для добавления опций.

    Опции:
        --bn: Браузер (chrome, remote_chrome, firefox)
        --h: Режим headless (True/False)
        --s: Размер окна {'width': int, 'height': int}
        --slow: Задержка между действиями (мс)
        --t: Таймаут по умолчанию (мс)
        --l: Локаль браузера
    """

    parser.addoption('--bn', action='store', default="chrome",
                   help="Choose browser: chrome, remote_chrome or firefox")
    parser.addoption('--h', action='store', default=False,
                   help='Choose headless: True or False')
    parser.addoption('--s', action='store', default="{'width': 1600, 'height': 900}",
                   help='Size window: width,height')
    # Закомментированные альтернативные размеры окон
    # parser.addoption('--s', action='store', default="{'width': 1920, 'height': 1080}",
    #                 help='Size window: width,height')
    # parser.addoption('--s', action='store', default="{'width': 1920, 'height': 300}",
    #                 help='Size window: width,height')
    # parser.addoption('--s', action='store', default="{'width': 300, 'height': 420}",
    #               help='Size window: width,height')
    parser.addoption('--slow', action='store', default=200,
                   help='Choose slow_mo for robot action')
    parser.addoption('--t', action='store', default=60000,
                   help='Choose timeout')
    parser.addoption('--l', action='store', default='ru-RU',
                   help='Choose locale')
    # Закомментированная опция для Qase
    # parser.addini('qs_to_api_token', default=os.getenv("QASE_TOKEN"), help='Qase app token')


@pytest.fixture(scope='class')
def browser(request: FixtureRequest) -> Page:
    """Фикстура для управления экземпляром браузера.

    Args:
        request: Объект запроса pytest для доступа к конфигурации.

    Returns:
        Page: Экземпляр страницы браузера.

    Yields:
        Page: Страница для использования в тестах.

    Note:
        Автоматически закрывает браузер после тестов.
    """

    playwright = sync_playwright().start()

    # Выбор браузера на основе параметра командной строки
    if request.config.getoption("bn") == 'remote_chrome':
        browser = get_remote_chrome(playwright, request)
        context = get_context(browser, request, 'remote')
        page_data = context.new_page()
    elif request.config.getoption("bn") == 'firefox':
        browser = get_firefox_browser(playwright, request)
        context = get_context(browser, request, 'local')
        page_data = context.new_page()
    elif request.config.getoption("bn") == 'chrome':
        browser = get_chrome_browser(playwright, request)
        context = get_context(browser, request, 'local')
        page_data = context.new_page()
    else:
        browser = get_chrome_browser(playwright, request)
        context = get_context(browser, request, 'local')
        page_data = context.new_page()

    yield page_data

    # Очистка после завершения тестов
    for context in browser.contexts:
        context.close()
    browser.close()
    playwright.stop()


def get_firefox_browser(playwright: Playwright, request: FixtureRequest) -> Browser:
    """Создает и возвращает экземпляр Firefox браузера.

    Args:
        playwright: Экземпляр Playwright.
        request: Объект запроса pytest.

    Returns:
        Browser: Экземпляр Firefox.
    """

    return playwright.firefox.launch(
        headless=request.config.getoption("h"),
        slow_mo=request.config.getoption("slow"),
    )


def get_chrome_browser(playwright: Playwright, request: FixtureRequest) -> Browser:
    """Создает и возвращает экземпляр Chrome браузера.

    Args:
        playwright: Экземпляр Playwright.
        request: Объект запроса pytest.

    Returns:
        Browser: Экземпляр Chrome.
    """

    return playwright.chromium.launch(
        headless=request.config.getoption("h"),
        slow_mo=request.config.getoption("slow"),
        args=['--s']
    )


def get_remote_chrome(playwright: Playwright, request: FixtureRequest) -> Browser:
    """Создает экземпляр Chrome для удаленного запуска.

    Args:
        playwright: Экземпляр Playwright.
        request: Объект запроса pytest.

    Returns:
        Browser: Экземпляр Chrome в headless режиме.
    """

    return playwright.chromium.launch(
        headless=True,
        slow_mo=request.config.getoption("slow")
    )


def get_context(browser: Browser, request: FixtureRequest, start: str) -> BrowserContext:
    """Создает и настраивает контекст браузера.

    Args:
        browser: Экземпляр браузера.
        request: Объект запроса pytest.
        start: Тип запуска ('local' или 'remote').

    Returns:
        BrowserContext: Настроенный контекст.
    """

    if start == 'local':
       # current_viewport = json.loads(request.config.getoption('--s'))

        context = browser.new_context(
            # no_viewport=True,
            viewport= ast.literal_eval(request.config.getoption('--s')),
            locale=request.config.getoption('l')
        )
        context.set_default_timeout(
            timeout=request.config.getoption('t')
        )
        # Пример добавления кук (закомментировано)
        # context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}])
        return context

    elif start == 'remote':
        context = browser.new_context(
            viewport=ast.literal_eval(request.config.getoption('--s')),
            locale=request.config.getoption('l')
        )
        context.set_default_timeout(
            timeout=request.config.getoption('t')
        )
        # Пример добавления кук (закомментировано)
        # context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}])
        return context


@pytest.fixture(scope="function")
def return_back(browser: Page):
    """Фикстура для возврата на предыдущую страницу.

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

    browser.go_back()
