"""Модуль компонента задания даты и времени.

Содержит класс для работы с компонентом задания даты и времени через Playwright.
"""

from playwright.sync_api import Page, Locator, expect
from tools.logger import get_logger
# from elements.text_element import Text
from elements.text_input_element import TextInput
from elements.button_element import Button
from components.date_picker_component import DatePickerComponent
from components.base_component import BaseComponent

logger = get_logger("DATE_INPUT")


class DateInput(BaseComponent):
    """Компонент задания даты и времени.

    Предоставляет методы для взаимодействия с элементами компонентом задания даты и времени.
    """

    def __init__(self, page: Page, locator: str | Locator):
        """Инициализирует компонент задания даты и времени.

        Args:
            page: Экземпляр страницы Playwright.
            locator: Локатор формы ввода даты и времени (строка или объект Locator)
        """

        super().__init__(page)

        self.date_input_locator = self.get_locator(locator)

        self.switch_mode_button = Button(page,
                                   self.date_input_locator.get_by_role("button"),
                                   "switch_mode_button")

        loc = self.date_input_locator.get_by_placeholder("дд.мм.гггг")
        self.date_input_field = TextInput(page, loc, "date_input")

        loc = self.date_input_locator.get_by_placeholder("00:00")
        self.time_input_field = TextInput(page, loc, "time_input")

        self.date_picker = DatePickerComponent(self.page)

    # Действия:
    def click_switch_mode_button(self) -> None:
        """ Нажатие на кнопку переключения режимов ввода (текстовый или календарь)."""

        self.switch_mode_button.click()

    def get_date_picker(self) -> DatePickerComponent:
        """ Возвращает экземпляр компонента средства выбора даты. """

        return self.date_picker

    def get_date_field_value(self) -> str:
        """ Возвращает текущее значение поля ввода даты. """

        return self.date_input_field.get_input_value()

    def get_time_field_value(self) -> str:
        """ Возвращает текущее значение поля ввода времени. """

        return self.time_input_field.get_input_value()

    def input_date(self, date: str) -> None:
        """ Ввод даты в формате дд.мм.гггг """

        day, month, year = date.split('.')
        assert len(day) == 2, "Incorrect day format: should be 'dd.mm.yyyy'"
        assert len(month) == 2, "Incorrect month format: should be 'dd.mm.yyyy'"
        assert len(year) == 4, "Incorrect year format: should be 'dd.mm.yyyy'"

        try:
            _ = int(day)
        except ValueError:
            assert False, f"Incorrect day value {day} for selection"

        try:
            _ = int(month)
        except ValueError:
            assert False, f"Incorrect month value {month} for selection"

        try:
            _ = int(year)
        except ValueError:
            assert False, f"Incorrect year value {year} for selection"

        if self.is_text_input_mode():
            self.date_input_field.check_editable_input("Text field for date input should be editable")
            self.date_input_field.clear()
            self.date_input_field.input_value(date)
        else:
            self.date_picker.select_year_and_month(year, month)
            self.date_picker.select_day(day)

    def input_time(self, time: str) -> None:
        """ Ввод даты в формате чч:мм """

        hours, minutes = time.split(':')
        assert len(hours) == 2, "Incorrect time format: should be 'hh:mm'"
        assert len(minutes) == 2, "Incorrect time format: should be 'hh:mm'"

        try:
            _ = int(hours)
        except ValueError:
            assert False, f"Incorrect hours value {hours} for selection"

        try:
            _ = int(minutes)
        except ValueError:
            assert False, f"Incorrect minutes value {minutes} for selection"

        self.time_input_field.check_editable_input("Text field for date input should be editable")
        self.time_input_field.clear()
        self.time_input_field.input_value(time)

    # Проверки:
    def check_content(self, label: str) -> None:
        """Проверка состава компонента ввода даты."""

        self.check_switch_mode_button_visibility()

        label_locator = self.date_input_locator.get_by_label(label)
        expect(label_locator).to_be_visible()

        self.date_input_field.check_visibility("Text field for date input is missing")
        self.date_input_field.check_empty_input("Text field for date input should be empty")

        self.click_switch_mode_button()
        self.page.wait_for_timeout(300)
        self.click_switch_mode_button()
        self.page.wait_for_timeout(300)

        self.date_picker.check_content()

        self.click_switch_mode_button()
        self.click_switch_mode_button()

        self.page.wait_for_timeout(300)
        self.input_date("11.11.2011")

        label_locator = self.date_input_locator.get_by_label("Время")
        expect(label_locator).to_be_visible()
        self.time_input_field.check_visibility("Text field for time input is missing")
        current_time_value = self.get_time_field_value()
        assert current_time_value == "00:00", \
            "Should be empty time input field"

    def check_switch_mode_button_visibility(self) -> None:
        """ Проверка видимости кнопки переключения режимов ввода."""

        self.switch_mode_button.check_visibility("Switch Mode Button is missing")

    def is_text_input_mode(self) -> bool:
        """ Проверка текстового режима ввода."""

        result = False

        inner_text = self.switch_mode_button.get_text(0).strip()
        if inner_text == "keyboard":
            result = True
        return result
