#!/usr/bin/env python
# -*- coding: utf-8 -*-

from framework.ui_libs.ui_lib import Page
from configs.modify_data import test_modify_data
from framework.other_proj_ui.ui_auto.fc_helpers import decorator_for_change_selenium_wait_and_return_after
import allure


class VulnerabilityPage(Page):
    """ Класс для работы с уязвимостями """

    def vp_open_fix_actions_menu_item(self):
        """ нажать 'Меры по устранению' на странице создания угрозы"""
        self.find_and_click(*self.locators.VP_CREATE_EDIT_PAGE_NAV_BAR_FIX_ACTIONS_ITEM)
        self.ba_wait_for_loading()

    def vp_click_save_btn(self):
        """ нажать кнопку Создать"""
        self.find_and_click(*self.locators.VP_CREATE_EDIT_PAGE_SAVE_BTN)
        self.ba_wait_for_loading()
        self.search_element(*self.locators.VP_VULNERABILITY_VIEW_PAGE)

    def vp_get_vulnerability_id(self):
        """Получить id запроса"""
        self.ba_wait_for_loading()
        test_modify_data['vulnerability_id'] = self.driver.current_url.partition('/vulnerabilities/view/')[2]
        self.log.info('Получен id созданной уязвимости: {}'.format(test_modify_data['vulnerability_id']))
        allure.attach(self.driver.current_url, 'Ссылка на уязвимость', allure.attachment_type.URI_LIST)

    def vp_create_vulnerability_from_ef(self):
        """ метод, объединяющий шаги по созданию уязвимости из ЭФ """
        self.vp_open_fix_actions_menu_item()
        self.vp_click_save_btn()
        self.vp_get_vulnerability_id()

    def vp_click_common_info_link_on_view_page(self):
        """ нажать 'Общие сведения' на странице просмотра уязвимости """
        self.find_and_click(*self.locators.VP_VULNERABILITY_VIEW_NAV_BAR_COMMON_INFO)
        self.ba_wait_for_loading()

    def vp_click_software_link_on_view_page(self):
        """ нажать 'Программное обеспечение' на странице просмотра уязвимости """
        self.find_and_click(*self.locators.VP_VULNERABILITY_VIEW_NAV_BAR_SW)
        self.ba_wait_for_loading()

    def vp_click_method_to_detect_link_on_view_page(self):
        """ нажать 'Способ обнаружения' на странице просмотра уязвимости """
        self.find_and_click(*self.locators.VP_VULNERABILITY_VIEW_NAV_BAR_METHOD_TO_DETECT)
        self.ba_wait_for_loading()

    def vp_click_fix_actions_link_on_view_page(self):
        """ нажать 'Меры по устранению' на странице просмотра уязвимости """
        self.find_and_click(*self.locators.VP_VULNERABILITY_VIEW_NAV_BAR_FIX_ACTIONS)
        self.ba_wait_for_loading()

    def vp_compare_send_data_with_vulnerability_data(self, send_data=None):
        """ сравнить отображаемые данные в уязвимости с данными, заданными при создании """
        self.vp_click_method_to_detect_link_on_view_page()
        self.vp_compare_vulnerability_with_send_data_on_method_to_detect(send_data)
        self.vp_click_fix_actions_link_on_view_page()
        self.vp_compare_vulnerability_with_send_data_on_fix_actions(send_data)

    @decorator_for_change_selenium_wait_and_return_after(5)
    def vp_compare_vulnerability_with_send_data_on_method_to_detect(self, send_data=None):
        """ метод сравнения данных на вкладке Способ обнаружения """
        if not send_data:
            send_data = test_modify_data['vulnerability_data'][0]['vulnerability']
        self.ba_wait_for_loading()

        method_descr = self.ba_return_elem_text_or_none(*self.locators.VP_VULNERABILITY_VIEW_METHOD_DESCRIPTION)
        if method_descr != send_data['methodToDetect']['description']:
            test_modify_data['errors'].append(f"Не совпадает 'Описание' в уязвимости, "
                                              f"ожидаемое {send_data['methodToDetect']['description']},"
                                              f" отображаемое {method_descr}")

        method_file = self.ba_return_elem_text_or_none(*self.locators.VP_VULNERABILITY_VIEW_METHOD_TO_DETECT_FILE)
        file_name = send_data['methodToDetect']['attachment']['file']['name']
        if method_file != file_name:
            test_modify_data['errors'].append(f"Не совпадает 'Вложение' в уязвимости, "
                                              f"ожидаемое {file_name}, отображаемое {method_file}")

    @decorator_for_change_selenium_wait_and_return_after(5)
    def vp_compare_vulnerability_with_send_data_on_fix_actions(self, send_data=None):
        """ метод сравнения данных на вкладке Меры по устранению """
        if not send_data:
            send_data = test_modify_data['vulnerability_data'][0]['vulnerability']
        self.ba_wait_for_loading()

        fix_actions = self.ba_return_elem_text_or_none(*self.locators.VP_VULNERABILITY_VIEW_FIX_ACTIONS)
        if fix_actions != send_data['fixActions']:
            test_modify_data['errors'].append(f"Не совпадает 'Возможные меры по устранению уязвимости' в уязвимости, "
                                              f"ожидаемое {send_data['fixActions']}, отображаемое {fix_actions}")