import allure
from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By

from page.home_page import HomePage
from utils.logger import logger


class IssuePage(HomePage):
    _CreateIssue = (By.CSS_SELECTOR, ".new-issue")
    _IssueName = (By.CSS_SELECTOR, "#issue_subject")
    # 跟踪
    _TRACKER = (By.CSS_SELECTOR, "#issue_tracker_id>option[selected='selected']")
    # 优先级下拉框
    # Priority_select = (By.CSS_SELECTOR, "#issue_priority_id")
    # 默认的优先级数据列表
    _Priority_list = ['Low', 'Normal', 'High', 'Urgent', 'Immediate']
    # 指派人
    _Assign = (By.CSS_SELECTOR, ".assign-to-me-link")
    _StartTime = (By.CSS_SELECTOR, "#issue_start_date")
    _DueTime = (By.CSS_SELECTOR, "#issue_due_date")
    # 描述信息
    _Description = (By.CSS_SELECTOR, "#issue_description")
    _File = (By.XPATH, "//*[@type='file']")
    _Commit = (By.CSS_SELECTOR, "[name='commit']")
    _Edit = (By.CSS_SELECTOR, ".icon.icon-edit")
    _NoAssign = (By.CSS_SELECTOR, "#issue_assigned_to_id>option")
    _issue_status_list = ['In Progress', 'Resolved', 'Feedback', 'Closed', 'Rejected', 'New']
    _UpdateDescription = (By.CSS_SELECTOR, "#issue_notes")

    @allure.step("点击新建问题")
    def to_create_issue(self):
        logger.info("点击新建问题")
        self.find_and_click(*self._CreateIssue)
        return self

    @allure.step("填写issue信息")
    def write_issue_messages(self, issue_name, priority=None, start_time=None, due_time=None, description=None, file_path=None, time_prefix="00"):
        """
        :param issue_name:
        :param priority: 优先级
        :param start_time: 开始时间
        :param due_time: 预计完成时间
        :param description: 描述
        :param file_path: 上传文件的路径
        :param time_prefix: 时间的前缀，用来拼接时间，作用于时间组件
        :return:
        """
        # 日期格式：002024-02-01
        logger.info("填写issue信息")
        if not issue_name:
            return self
        self.find_and_send(issue_name, *self._IssueName)
        if description:
            self.find_and_send(description, *self._Description)
        if priority and priority in self._Priority_list:
            _Priority = (By.XPATH, f"//*[text()='{priority}']")
            self.find_and_click(*_Priority)
        if start_time:
            self.find_and_send(time_prefix+start_time, *self._StartTime)
        if due_time:
            self.find_and_send(time_prefix+due_time, *self._DueTime)
        # 将issue指派给我
        self.find_and_click(*self._Assign)
        if file_path:
            self.find_and_send(file_path, *self._File)
        return self

    @allure.step("提交信息")
    def commit(self):
        logger.info("提交信息")
        self.set_time(0.5)
        self.finds(*self._Commit)[-1].click()
        return self

    @allure.step("点击编辑按钮")
    def edit_issue(self):
        logger.info("点击编辑按钮")
        self.find_and_click(*self._Edit)
        return self

    @allure.step("修改issue信息")
    def update_project_messages(self, issue_name=None, priority=None, start_time=None, due_time=None, description=None, status=None):
        # 日期格式：002024-02-01
        logger.info("修改issue信息")
        if issue_name:
            self.find_and_send(issue_name, *self._IssueName)
        if description:
            self.find_and_send(description, *self._UpdateDescription)
        if priority and priority in self._Priority_list:
            _Priority = (By.XPATH, f"//*[text()='{priority}']")
            self.find_and_click(*_Priority)
        if start_time:
            self.find_and_send("00"+start_time, *self._StartTime)
        if due_time:
            self.find_and_send("00"+due_time, *self._DueTime)
        # 将指派取消
        self.find_and_click(*self._NoAssign)
        # 更改issue状态
        if status and status in self._issue_status_list:
            _Status = (By.XPATH, f"//option[text()='{status}']")
            self.find_and_click(*_Status)
        return self

    @allure.step("删除issue")
    def delete_issue(self, name, handle: bool):
        logger.info("删除issue")
        data = (By.XPATH, f"//*[@class='subject']/a[text()='{name}']/../..//*[@title='行为']")
        delete = (By.CSS_SELECTOR, ".icon.icon-del")
        self.find_and_click(*data)
        self.set_time(0.5)
        self.find_and_click(*delete)
        self.handle_alert(handle)
        return self

    def handle_alert(self, handle: bool):
        # 切换到alert弹窗，根据参数判断是接受还是取消
        alert = self._driver.switch_to.alert
        if handle:
            logger.info("确认删除")
            alert.accept()
        else:
            logger.info("取消删除")
            alert.dismiss()
        return self

    @allure.step("断言页面数据是否存在")
    def get_undelete_data(self, name):
        # 删除操作后，断言数据是否在页面存在
        data = (By.XPATH, f"//*[@class='subject']/a[text()='{name}']")
        try:
            self.find(*data)
            logger.info("数据未删除")
        except NoSuchElementException:
            return False
        return True

    @allure.step("断言创建后的issue信息")
    def assert_page_information(self):
        # 断言页面信息
        _title = (By.CSS_SELECTOR, ".subject h3")
        _status = (By.CSS_SELECTOR, ".status.attribute>div.value")
        _start_time = (By.CSS_SELECTOR, ".start-date.attribute>div.value")
        _priority = (By.CSS_SELECTOR, ".priority.attribute>div.value")
        _assigned = (By.CSS_SELECTOR, ".assigned-to.attribute>div.value")
        # 计划完成日期
        _due_time = (By.CSS_SELECTOR, ".due-date.attribute>div.value")
        # 完成百分比
        _percentage = (By.CSS_SELECTOR, ".progress.attribute p.percent")
        # 预期时间
        _expected_time = (By.CSS_SELECTOR, ".estimated-hours.attribute>div.value")
        page_information = {'title': self.get_text(*_title),
                            'status': self.get_text(*_status),
                            'start_time': self.get_text(*_start_time),
                            'priority': self.get_text(*_priority),
                            'due_time': self.get_text(*_due_time),
                            'assigned': self.get_text(*_assigned),
                            'percentage': self.get_text(*_percentage),
                            'expected_time': self.get_text(*_expected_time)}
        return page_information

    @allure.step("获取页面展示的文件信息")
    def get_file_message(self):
        _file_name = (By.CSS_SELECTOR, "a.icon.icon-attachment")
        return self.get_text(*_file_name)


