"""Модуль modal_change_password содержит класс для работы с окном изменения пароля текущего пользователя.

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

from playwright.sync_api import Page
from tools.logger import get_logger
from locators.text_input_locators import TextInputLocators
from locators.modal_window_locators import ModalWindowLocators
from elements.text_element import Text
from elements.text_input_element import TextInput
from elements.icon_element import Icon
from data.environment import host
from components.modal_window_component import ModalWindowComponent
from components.alert_component import AlertComponent

logger = get_logger("CHANGE_PASSWORD_MODAL_WINDOW")


class ChangePasswordModalWindow(ModalWindowComponent):
    """Модальное окно изменения пароля текущего пользователя.

    Наследует ModalWindowComponent и добавляет:
    - Поля задания пароля
    - Кнопки действий (Сохранить, Отменить)
    """

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

        super().__init__(page)

        modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)

        # Тулбар с заголовком
        user_name = host.get_current_user_name()
        self.add_toolbar_title(f"Изменить пароль для пользователя {user_name}?")

        # Поля ввода пароля
        loc = modal_window_locator.get_by_label("Введите текущий пароль *")
        old_password_input = TextInput(page, loc, "old_password_input")
        self.add_content_item("old_password_input", old_password_input)

        icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
        old_password_hidden_icon = Icon(page, icon_locator,
                                         "old password hidden icon")
        self.add_content_item("old_password_hidden_icon", old_password_hidden_icon)

        loc = modal_window_locator.get_by_label("Введите новый пароль *")
        new_password_input = TextInput(page, loc, "new_password_input")
        self.add_content_item("new_password_input", new_password_input)

        icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
        new_password_hidden_icon = Icon(page, icon_locator,
                                         "new password hidden icon")
        self.add_content_item("new_password_hidden_icon", new_password_hidden_icon)

        loc = modal_window_locator.get_by_label("Введите повторно новый пароль *")
        confirm_password_input = TextInput(page, loc, "confirm_password_input")
        self.add_content_item("confirm_password_input", confirm_password_input)

        icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
        confirm_password_hidden_icon = Icon(page, icon_locator,
                                           "confirm password hidden icon")
        self.add_content_item("confirm_password_hidden_icon", confirm_password_hidden_icon)

        input_form_error_message = Text(page,
                                       modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE),
                                       "input form error message")
        self.add_content_item("input_form_error_message", input_form_error_message)

        # Добавление кнопок действий
        locator_button_save = self.page.get_by_role("button", name="Сохранить")
        self.add_button(locator_button_save, "save")

        locator_button_cancel = self.page.get_by_role("button", name="Отменить")
        self.add_button(locator_button_cancel, "cancel")

        # Alert при успешном добавлении пользователя
        self.alert = AlertComponent(page)

    # Действия:
    def click_cancel_button(self) -> None:
        """Нажимает кнопку 'Отменить'"""

        self.get_button_by_name("cancel").click()

    def click_old_password_hidden_icon(self) -> None:
        """Нажатие на иконку скрытия старого пароля."""

        self.get_content_item("old_password_hidden_icon").click()

    def click_new_password_hidden_icon(self) -> None:
        """Нажатие на иконку скрытия нового пароля."""

        self.get_content_item("new_password_hidden_icon").click()

    def click_confirm_password_hidden_icon(self) -> None:
        """Нажатие на иконку скрытия пароля подтверждения."""

        self.get_content_item("confirm_password_hidden_icon").click()

    def change_password(self, old_password: str, new_password: str):
        """Заполняет элементы формы, нажимает кнопку 'Сохранить'"""

        error = ""

        self.get_content_item("old_password_input").input_value(old_password)
        self.get_content_item("new_password_input").input_value(new_password)
        self.get_content_item("confirm_password_input").input_value(new_password)

        button_save = self.get_button_by_name("save")

        if button_save.is_disabled():
            error_message = self.get_content_item("input_form_error_message")
            error = error_message.get_text(0)
            return False, error

        button_save.click()

        is_changed = False

        alert_type = self.alert.get_alert_type()
        if alert_type == "success":
            self.alert.check_alert_presence(' Пароль успешно изменён ')
            self.alert.check_alert_absence(' Пароль успешно изменён ')
            is_changed = True
        elif alert_type == "error":
            self.alert.check_alert_presence(' Неверно указан текущий пароль ')
            self.alert.check_alert_absence(' Неверно указан текущий пароль ')

            error = "Old password is not equal real password"
        else:
            error = f"Got unexpected alert type {alert_type}"

        return is_changed, error

    def get_password_inputs(self) -> []:
        """Возвращает список полей ввода пароля (для тестовых целей)."""

        text_inputs = []
        text_inputs.append(self.get_content_item("old_password_input"))
        text_inputs.append(self.get_content_item("new_password_input"))
        text_inputs.append(self.get_content_item("confirm_password_input"))
        return text_inputs

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

        self.check_by_window_title()

        self.get_content_item("old_password_input").check_visibility(
                                  "Old password input form is missing"
                             )
        old_password_hidden_icon = self.get_content_item("old_password_hidden_icon")
        old_password_hidden_icon.check_visibility(
                                  "Old password hidden icon is missing"
                             )
        is_hidden_state = old_password_hidden_icon.is_password_hidden()
        assert is_hidden_state, "Old password hidden icon should be in hidden state"

        self.get_content_item("new_password_input").check_visibility(
                                  "New password input form is missing"
                             )
        new_password_hidden_icon = self.get_content_item("new_password_hidden_icon")
        new_password_hidden_icon.check_visibility(
                                  "New password hidden icon is missing"
                             )
        is_hidden_state = new_password_hidden_icon.is_password_hidden()
        assert is_hidden_state, "New password hidden icon should be in hidden state"

        self.get_content_item("confirm_password_input").check_visibility(
                                  "Confirm password input form is missing"
                             )
        confirm_password_hidden_icon = self.get_content_item("confirm_password_hidden_icon")
        confirm_password_hidden_icon.check_visibility(
                                  "Confirm password hidden icon is missing"
                             )
        is_hidden_state = confirm_password_hidden_icon.is_password_hidden()
        assert is_hidden_state, "Confirm password hidden icon should be in hidden state"

        self.check_button_visibility("cancel")

        button_save = self.get_button_by_name("save")
        is_disabled = button_save.is_disabled()
        assert is_disabled, "Button 'Сохранить' should be hidden"

    def check_error_message(self, text: str) -> None:
        """Проверяет сообщение об ошибке, возникшее при заполнении полей формы."""

        error_message = self.get_content_item("input_form_error_message")
        error_message.check_have_text(text, "Unexpected error message")
