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

from playwright.sync_api import Page, Locator, expect
from tools.logger import get_logger
from elements.button_element import Button
from components.base_component import BaseComponent
from components_derived.selection_bar_component import SelectionBarComponent
from components_derived.date_input_component import DateInput

logger = get_logger("EVENTS_FILTER_PANEL")


class EventsFilterPanel(BaseComponent):
    """Панель формы ввода полей фильтрации отображения данных в панели событий. Предоставляет методы
    для взаимодействия с формой, ее содержимым и проверок."""

    def __init__(self, page: Page):
        """Инициализирует компонент модального окна формы ввода параметров фильтрации.

        Args:
            page: Экземпляр страницы Playwright
        """
        super().__init__(page)

        self.events_filter_locator = self.page.locator("div.menuable__content__active div.scrollarea__body")

        # Поля ввода даты начала и даты окончания события
        loc = self.page. \
              locator("div.menuable__content__active div.scrollarea__body > div:nth-child(1) > div:nth-child(1)")
        self.start_time_filter = DateInput(page, loc)
        loc = self.page. \
              locator("div.menuable__content__active div.scrollarea__body > div:nth-child(1) > div:nth-child(2)")
        self.finish_time_filter = DateInput(page, loc)

        # Поля задания параметров фильтрации (произвольное количество)
        self.filtering_parameters = {}

        # Кнопки задания/сброса параметров фильтрации
        self.apply_button = Button(page,
                                   self.page.get_by_role("button").filter(has_text='Применить Фильтры'),
                                   "apply_button")
        self.reset_button = Button(page,
                                   self.page.get_by_role("button").filter(has_text='Сбросить Фильтры'),
                                   "reset_button")
        self.close_button = Button(page,
                                   self.page.get_by_role("button").filter(has_text='Закрыть'),
                                   "close_button")

    # Действия:
    def add_filtering_parameter(self, name: str, title: str) -> None:
        """Добавляет поле задания параметров фильтрации по заданному имени."""

        # loc =  self.events_filter_locator.get_by_role("combobox").filter(has_text=title)
        loc =  self.events_filter_locator.get_by_role("combobox").get_by_placeholder(title)
        self.filtering_parameters[name] = SelectionBarComponent(self.page, loc)

    def get_filtering_parameter(self, name: str) -> SelectionBarComponent | None:
        """Возвращает поле задания параметров фильтрации по заданному или None, если не найдено."""

        return self.filtering_parameters.get(name)

    def get_start_time_filter(self) -> DateInput:
        """Возвращает поле задания параметров фильтрации даты начала."""

        return self.start_time_filter

    def get_finish_time_filter(self) -> DateInput:
        """Возвращает поле задания параметров фильтрации даты окончания."""

        return self.finish_time_filter

    def click_apply_button(self) -> None:
        """Клик по кнопке применения фильтра."""

        self.apply_button.click()

    def click_reset_button(self) -> None:
        """Клик по кнопке сброса фильтра."""

        self.reset_button.click()

    def click_close_button(self) -> None:
        """Клик по кнопке закрытия окна фильтрации."""

        self.close_button.click()

    # Проверки:
    def check_content(self) -> None:
        """Проверяет наличие постоянных полей панели параметров фильтрации."""

        self.start_time_filter.check_content("Дата начала")
        self.finish_time_filter.check_content("Дата окончания")

        self.check_apply_button_visibility()
        self.check_reset_button_visibility()
        self.check_close_button_visibility()

    def check_vertical_scrolling(self, locator: str| Locator) -> bool:
        """Проверяет возможность вертикальной прокрутки формы."""

        return self.is_scrollable_vertically(locator)

    def check_apply_button_visibility(self) -> None:
        """Проверяет наличие кнопки применения фильтра."""

        self.apply_button.check_visibility("Apply Filter Button is missing")

    def check_close_button_visibility(self) -> None:
        """Проверяет наличие кнопки закрытия окна фильтрации."""

        self.close_button.check_visibility("Close Filter window Button is missing")

    def check_reset_button_visibility(self) -> None:
        """Проверяет наличие кнопки сброса фильтра."""

        self.reset_button.check_visibility("Reset Filter Button is missing")

    def should_be_filtering_parameter(self, title: str) -> None:
        """Проверяет наличие поля панели параметров фильтрации по его заголовку."""

        loc =  self.events_filter_locator.get_by_role("combobox").get_by_placeholder(title)
        expect(loc).to_be_visible(), f"Filtering parameter bar '{title}' is missing"
