from time import sleep
from hytest import *
# 获取当前脚本的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建预定系统的绝对路径
预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..','..'))
# 添加路径
sys.path.append(预定系统_path)
# 导入模块
try:
    from 预定系统.Base.base import *
except ModuleNotFoundError as e:
    print(f"ModuleNotFoundError: {e}")
    print("尝试使用绝对路径导入")
    from 预定系统.Base.base import *

# 获取当前脚本所在的目录
current_dir = os.path.dirname(os.path.abspath(__file__))

# 构建CSV文件的绝对路径
csv_file_path = os.path.join(current_dir, '../../../测试数据/会议室管理/会议室管理模块/会议室编辑.csv')

class Conference_Edit_000x:
    tags = ['会议室管理功能' , '后台管理功能']
    """
        执行指令：
            1.cd 预定系统
            2.hytest --report_title 会议室编辑测试报告 --test 会议室编辑_0**
    """
    ddt_cases = read_csv_data(csv_file_path)

    def teststeps(self):
        """
            执行测试步骤以会议室新增功能。
            本函数根据参数输入会议室名称、，并检查新增后的提示信息是否与预期相符。
        """
        # 初始化通知文本为空字符串
        notify_text = ""
        # 从全局存储中获取webdriver实例
        wd = GSTORE['wd']
        # 从self.para中解构出用户名、密码、验证码和检查文本
        name = self.name
        conference_name, new_conference_name, conference_function, new_conference_function, conference_capacity, new_conference_capacity, max_book_day, open_department, check_text = self.para

        # 步骤1：搜索会议室
        STEP(1, f"搜索会议室：{conference_name}")
        # 日志记录：输入查询文本
        INFO(f"输入查询文本：{conference_name}")
        # 在搜索框中输入会议室名称
        safe_send_keys((By.XPATH, "//input[@placeholder='输入关键字']"), conference_name, wd)
        # 触发搜索操作
        send_keyboard((By.XPATH, "//input[@placeholder='输入关键字']"), wd)
        sleep(1)

        # 步骤2：点击编辑按钮
        STEP(2, "点击编辑按钮")
        # 点击指定会议室的编辑按钮
        safe_click((By.XPATH, "//div[contains(@class,'cell el-tooltip')]//span[1]"), wd)
        sleep(1)

        # 步骤3：检查修改界面的标题
        STEP(3, "检查修改界面的标题")
        # 获取修改会议室界面的标题文本
        notify_text = elment_get_text((By.XPATH, "//span[contains(text(),'修改会议室')]"), wd)
        # 日志记录：检查修改界面的标题
        INFO(f"检查修改界面的标题：{notify_text}")
        # 检查点：验证修改会议室界面的标题是否正确
        CHECK_POINT("检查修改界面的标题是否正确", "修改会议室" in notify_text)

        # 步骤4：输入新会议室名称
        STEP(4, "输入新会议室名称")
        sleep(1)
        # 在会议室名称输入框中输入新的会议室名称
        safe_send_keys((By.XPATH, "//input[contains(@placeholder,'输入会议室名称')]"), new_conference_name, wd)
        sleep(1)

        # 步骤5：选择新会议室功能
        STEP(5, "选择新会议室功能")
        # 打开功能设置弹窗并选择新的会议室功能

        # 点击功能设置按钮，打开功能设置弹窗
        safe_click((By.XPATH, "//span[contains(text(),'设置(1)')]"), wd)

        # 暂停1秒，等待功能设置弹窗加载完成
        sleep(1)

        # 获取功能设置弹窗的标题文本，用于验证弹窗是否正确显示
        notify_text = elment_get_text((By.XPATH, "//span[contains(text(),'会议室功能')]"), wd)

        # 记录日志，检查功能设置弹窗的标题是否正确
        INFO(f"检查会议室功能设置弹窗标题是否为：{notify_text}")

        # 检查点：验证功能设置弹窗是否正确弹出
        CHECK_POINT("检查是否弹出功能设置弹窗", notify_text == "会议室功能")

        # 清除已有功能
        sleep(2)
        safe_click((By.XPATH,f"//span[contains(text(),'{conference_function}')]"), wd)
        safe_click((By.XPATH, "//button[contains(@class,'el-button el-button--primary el-transfer__button')]"),wd)

        # 步骤5：在功能设置中搜索特定的会议室功能
        STEP(5, f"搜索会议室功能：{new_conference_function}")
        sleep(1)
        # 在搜索框中输入会议室功能的关键字
        safe_send_keys((By.XPATH, "(//input[@placeholder='输入关键字'])[1]"), new_conference_function, wd)

        # 发送键盘事件，触发搜索操作
        send_keyboard((By.XPATH, "(//input[@placeholder='输入关键字'])[1]"), wd)

        # 暂停2秒，等待搜索结果加载完成，并选择功能
        sleep(2)
        safe_click((By.XPATH, f"//span[contains(text(),'{new_conference_function}')]"), wd)
        sleep(1)
        safe_click((By.XPATH, "//button[@class='el-button el-button--primary el-transfer__button']"),wd)
        safe_click((By.XPATH, "//div[contains(@aria-label,'会议室功能')]//div[contains(@class,'el-dialog__footer')]//button[contains(@type,'button')]"),wd)

        # 根据开放部门的不同设置进行不同的操作
        if open_department == "测试":
            STEP(6, f"开放部门设置为：{open_department}")
            # 取消默认选中的“全部开放”选项
            safe_click((By.XPATH,
                        "//span[contains(@class,'el-checkbox__input is-checked')]//span[contains(@class,'el-checkbox__inner')]"), wd)
            sleep(2)
            # 点击“单独设置”选项
            safe_click((By.XPATH, "//span[contains(text(),'单独设置')]"), wd)
            sleep(2)
            # 选择特定的部门
            safe_click(
                (By.XPATH, "//div[@class='el-tree-node is-expanded is-focusable']//span[@class='el-checkbox__inner']"),
                wd)
            # 确认选择
            safe_click(
                (By.XPATH, "//div[@aria-label='开放部门']//div[@class='el-dialog__footer']//button[@type='button']"),
                wd)
            sleep(1)

        elif open_department == "全部开放":
            STEP(6, f"开放部门设置为：{open_department}")
            # 选择“全部开放”选项
            safe_click((By.XPATH, "//span[contains(text(),'全部开放')]"), wd)
            sleep(1)

        # 步骤7：输入新会议室容纳人数
        STEP(7, f"输入新会议室容纳人数：{new_conference_capacity}")
        # 在容纳人数输入框中输入新的容纳人数
        safe_send_keys((By.XPATH, "//input[contains(@placeholder,'2')]"), new_conference_capacity, wd)
        sleep(1)

        # 步骤8：输入最大预约天数
        STEP(8, f"输入最大预约天数：{max_book_day}")
        # 在最大预约天数输入框中输入新的预约天数
        safe_send_keys((By.XPATH, "//div[@class='reserve_input']//div[4]//input[1]"), max_book_day, wd)
        sleep(1)

        # 步骤9：点击保存按钮
        STEP(9, "点击保存按钮")
        # 点击保存按钮以保存所有更改
        safe_click((By.XPATH, "//span[contains(text(),'保 存')]"), wd)
        sleep(2)

        # 步骤10：检查修改结果
        STEP(10, "检查修改结果")
        # 获取修改结果的提示信息
        notify_text = get_notify_text(wd, (
            By.XPATH, "//p[contains(@class,'el-message__content')]"), "Conference_Manage", "Conference_Edit",
                                          f"{name}_会议室编辑提示信息")
        # 日志记录：修改结果
        INFO(f"修改结果为：{notify_text}")
        # 检查点：验证修改结果是否正确
        CHECK_POINT("检查修改结果是否正确", notify_text == check_text)

        # 步骤11：检查数据回显
        STEP(11, "检查数据回显")
        # 在搜索框中输入新的会议室名称以查找修改后的会议室
        safe_send_keys((By.XPATH, "//input[@placeholder='输入关键字']"), new_conference_name, wd)
        # 触发搜索操作
        send_keyboard((By.XPATH, "//input[@placeholder='输入关键字']"), wd)
        sleep(2)

        # 获取会议室名称的回显文本
        conference_name_text = elment_get_text((By.XPATH, "//tbody/tr[@class='el-table__row']/td[2]/div[1]"), wd)
        # 获取会议室容纳人数的回显文本
        conference_capacity_text = elment_get_text((By.XPATH, f"//div[normalize-space()='{new_conference_capacity}']"),
                                                   wd)
        # 获取会议室功能的回显文本
        conference_function_text = elment_get_text((By.XPATH, f"//div[normalize-space()='{new_conference_function}']"),
                                                   wd)
        # 获取最大预约天数的回显文本
        conference_maxbook_text = elment_get_text((By.XPATH, f"//div[normalize-space()='{max_book_day}']"), wd)
        # 获取开放部门的回显文本
        conference_open_text = elment_get_text((By.CSS_SELECTOR,
                                                "body > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(7) > div:nth-child(1)"),
                                               wd)

        # 日志记录：数据回显结果
        INFO(
            f"数据回显结果为：{conference_name_text},{conference_capacity_text},{conference_function_text},{conference_maxbook_text},{conference_open_text}")
        # 检查点：验证数据回显是否正确
        CHECK_POINT("检查数据回显是否正确",
                    new_conference_name in conference_name_text and new_conference_capacity in conference_capacity_text and new_conference_function in conference_function_text and max_book_day in conference_maxbook_text and open_department in conference_open_text)

        if name == '会议室编辑_003':
            wd.refresh()