"""Модуль rack_locators содержит локаторы элементов страницы стойки.

Класс RackLocators хранит XPath локаторы для взаимодействия
с элементами интерфейса стойки оборудования в тестах.

"""

class RackLocators:
    """Класс для хранения локаторов элементов страницы стойки.

    Содержит локаторы в формате XPath для поиска элементов:
    - Вкладки стойки (верхние вкладки)
    - Секции лицевой и обратной сторон стойки
    - Юниты и устройства на стойке
    - Поля формы редактирования и создания стойки
    - Контейнеры и структурные элементы
    """

    # Основной контейнер вкладок стойки (верхние вкладки)
    ALL_TABS = "//div[@data-testid='CABINET_SHOW__tabs']//a[contains(@class, 'v-tabs__item')]"

    # Универсальный локатор для любой вкладки по имени
    TAB_BY_NAME = ("//div[starts-with(@data-testid, 'CABINET_SHOW__') and "
                  "contains(@class, 'v-tabs__div')]//a[contains(@class, 'v-tabs__item') and "
                  ".//*[contains(., '{}')]]")

    # Локатор для активной вкладки
    ACTIVE_TAB = ("//div[@data-testid='CABINET_SHOW__tabs']"
                 "//a[contains(@class, 'v-tabs__item--active')]")

    # ================ ЛОКАТОРЫ ДЛЯ ФОРМЫ СОЗДАНИЯ СТОЙКИ ===================

    # Контейнер формы создания стойки
    CREATE_RACK_FORM_CONTAINER = "//div[contains(@class, 'flex xs6 pa-0')]"

    # Text
    CREATE_RACK_FORM_FIELD_NAME = "[data-testid='create-location-bar__text-field__name']"
    CREATE_RACK_FORM_FIELD_COMMENT = "[data-testid='create-location-bar__text-field__comment']"
    CREATE_RACK_FORM_FIELD_SERIAL = "[data-testid='create-location-bar__text-field__serial_number']"
    CREATE_RACK_FORM_FIELD_INVENTORY = "[data-testid='create-location-bar__text-field__inventory_number']"

    # Сombobox
    CREATE_RACK_FORM_SELECT_USIZE = "[data-testid='create-location-bar__select__usize']"
    CREATE_RACK_FORM_SELECT_DEPTH = "[data-testid='create-location-bar__select__depth']"
    CREATE_RACK_FORM_SELECT_CABLE_INPUT = "[data-testid='create-location-bar__select__cable_input']"
    CREATE_RACK_FORM_SELECT_CONDITION_TYPE = "[data-testid='create-location-bar__select__condition_type']"
    CREATE_RACK_FORM_SELECT_OWNER = "[data-testid='create-location-bar__select__owner']"
    CREATE_RACK_FORM_SELECT_SERVICE_PROVIDER = "[data-testid='create-location-bar__select__service_provider']"
    CREATE_RACK_FORM_SELECT_PROJECT = "[data-testid='create-location-bar__select__project']"


    # ================ ЛОКАТОРЫ ДЛЯ ФОРМЫ РЕДАКТИРОВАНИЯ СТОЙКИ ===================

    # Форма редактирования стойки в модальном окне
    EDIT_RACK_FORM = "[data-testid='cabinet-bar__cabinet-form']"

    # Text
    EDIT_RACK_FORM_FIELD_NAME = "[data-testid='cabinet-bar__main__text-field__name']"
    EDIT_RACK_FORM_FIELD_COMMENT = "[data-testid='cabinet-bar__main__text-field__comment']"
    EDIT_RACK_FORM_FIELD_SERIAL = "[data-testid='cabinet-bar__main__text-field__serial_number']"
    EDIT_RACK_FORM_FIELD_INVENTORY = "[data-testid='cabinet-bar__main__text-field__inventory_number']"
    EDIT_RACK_FORM_FIELD_POWER = "[data-testid='cabinet-bar__main__text-field__allocated_power']"

    # Сombobox
    EDIT_RACK_FORM_SELECT_CABLE_INPUT = "[data-testid='cabinet-bar__select_enum__select-field__cable_input']"
    EDIT_RACK_FORM_SELECT_CONDITION_TYPE = "[data-testid='cabinet-bar__select_enum__select-field__condition_type']"
    EDIT_RACK_FORM_SELECT_DEPTH = "[data-testid='cabinet-bar__select_enum__select-field__depth']"
    EDIT_RACK_FORM_SELECT_USIZE = "[data-testid='cabinet-bar__select_enum__select-field__usize']"
    EDIT_RACK_FORM_SELECT_OWNER = "[data-testid='cabinet-bar__select__select-field__owner']"
    EDIT_RACK_FORM_SELECT_SERVICE_PROVIDER = "[data-testid='cabinet-bar__select__select-field__service_provider']"
    EDIT_RACK_FORM_SELECT_PROJECT = "[data-testid='cabinet-bar__select__select-field__project']"

    # Checkbox
    EDIT_RACK_FORM_CHECKBOX_VENTILATION = "[data-testid='cabinet-bar__main__checkbox__available_ventilation_panel'] input[type='checkbox']"
    EDIT_RACK_FORM_CHECKBOX_VENTILATION_LABEL = "label:has-text('Вентиляционная панель')"
    EDIT_RACK_FORM_DATA_CHECKBOX_VENTILATION_CONTAINER = "[data-testid='cabinet-bar__main__checkbox__available_ventilation_panel']"

    # ================ ЛОКАТОРЫ ДЛЯ ВЫПАДАЮЩИХ СПИСКОВ ===================

    # Локаторы для меню combobox
    MENU_ACTIVE_RACK_FORM = "//div[contains(@class, 'menuable__content__active')]"
    MENU_ACTIVE_ITEMS = "//div[@role='list']//div[@role='listitem']"

    # Локаторы для выпадающего меню (которые использовались в старом коде)
    DROPDOWN_LIST = 'div.menuable__content__active div[role="list"]'
    DROPDOWN_ITEM_BY_TEXT = ('div.menuable__content__active '
                            'div[role="listitem"]:has(span:has-text("{}"))')

    # CSS селекторы для ошибок валидации
    ERROR_CSS_SELECTORS = ".error--text, .v-input--error"

    # ================ ЛОКАТОРЫ ДЛЯ СТРУКТУРЫ СТОЙКИ ===================

    # Общий контейнер стойки (включает кнопки переключения сторон и MAIN_CONTAINER)
    RACK_CONTAINER = ("//div[contains(@class, 'layout active') and "
                     "contains(@class, 'row') and contains(@class, 'shrink')]")

    # Основной контейнер стойки (изображение стойки)
    MAIN_CONTAINER = "//div[contains(@class, 'layout cabinet')]"

    # Кнопки переключения сторон
    FRONT_SIDE_BUTTON = "//button[@data-testid='page-cabinet__btn__mount_front']"
    BACK_SIDE_BUTTON = "//button[@data-testid='page-cabinet__btn__mount_rear']"

    # Локаторы для определения активной стороны
    ACTIVE_SIDE_BUTTON = "//button[contains(@class, 'primary--text')]"

    # Кнопка добавления (add_circle)
    ADD_CIRCLE_BUTTON = "//i[contains(text(), 'add_circle')]"

    # Все юниты на стойке
    ALL_UNITS = "//div[contains(@class, 'unit')]"

    # Позиции юнитов
    UNIT_POSITIONS = ("//div[contains(@class, 'headline') and "
                     "contains(@class, 'test-xs-center') and "
                     "contains(@class, 'unit-positions')]")

    # Локатор для устройств
    DEVICE_ELEMENTS = "//div[contains(@class, 'parent-class')]"

    # Локатор для слотов в устройствах
    DEVICE_SLOTS = "//div[contains(@class, 'slot')]"

    # Кнопка редактирования свойств стойки
    EDIT_BUTTON = "//button[@data-testid='CABINET_SHOW__btn__edit']"

    # Кнопка "Скрыть стойку"
    HIDE_RACK_BUTTON = ("//div[@data-testid='CABINET_SHOW__div__hideCabinet' and "
                       "contains(@class, 'cabinet_hide_button_trigger_show')]")

    # Кнопка "Показать стойку"
    SHOW_RACK_BUTTON = ("//div[@data-testid='CABINET_SHOW__div__hideCabinet' and "
                       "contains(@class, 'cabinet_hide_button_trigger_hide')]")

    # Кнопки тулбара стойки
    TOOLBAR_REPLACE_BUTTON = "[data-testid='cabinet-bar__toolbar__btn__replace']"
    TOOLBAR_DONE_BUTTON = "[data-testid='cabinet-bar__toolbar__btn__done']"
    TOOLBAR_CLOSE_BUTTON = "[data-testid='cabinet-bar__toolbar__btn__close']"
    TOOLBAR_REMOVE_BUTTON = "[data-testid='cabinet-bar__toolbar__btn__remove']"

    # Диалог удаления
    REMOVE_DIALOG = "[data-testid='cabinet-bar__toolbar__dialog-remove']"

    # Кнопки подтверждения удаления
    CONFIRM_REMOVE_YES_BUTTON = "[data-testid='cabinet-bar__card_confirmation__btn__yes']"
    CONFIRM_REMOVE_NO_BUTTON = "[data-testid='cabinet-bar__card_confirmation__btn__no']"

    # ================ ЛОКАТОРЫ ДЛЯ ВКЛАДОК в модальном окне редактирования ==

    # Локаторы для вкладок в модальном окне редактирования
    MODAL_TAB_GENERAL = "[data-testid='cabinet-bar__main_tab']"
    MODAL_TAB_IMAGE = "[data-testid='cabinet-bar__photo_tab']"
    MODAL_TAB_SETTINGS = "[data-testid='cabinet-bar__settings_tab']"

    # ================ ЛОКАТОРЫ ДЛЯ ВКЛАДКИ "Изображение" ===================

    IMAGE_UPLOAD_CONTAINER = "div.layout.column.fill-height.justify-center.align-center"
    IMAGE_UPLOAD_ICON = "i.mdi-add_photo_alternate"
    IMAGE_UPLOAD_INPUT = "input.button-file-upload__input[type='file']"
    IMAGE_PREVIEW = "img"
    IMAGE_CONTAINER = "div.layout.column.fill-height.justify-center.align-center"

    # ================ ЛОКАТОРЫ ДЛЯ ВКЛАДКИ "НАСТРОЙКИ" ===================

    # Контейнер вкладки "Настройки"
    SETTINGS_CONTAINER = "div.layout.back.fill-height.justify-start"
    SETTINGS_ACCESS_MANAGER_TITLE = "div.v-toolbar__title:has-text('Менеджер доступа')"

    # Локаторы для полей правил доступа
    SETTINGS_READ_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.read']"
    SETTINGS_WRITE_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.write']"
    SETTINGS_SMS_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.sms']"
    SETTINGS_EMAIL_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.email']"
    SETTINGS_PUSH_RULES = "[data-testid*='rules.push']"

    # Кнопки вкладки "Настройки"
    SETTINGS_CANCEL_BUTTON = "[data-testid='LOCATION_SETTINGS__btn__cancel']"
