#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
@File    :   list_page.py
@Time    :   2024/11/20 17:04:10
@Author  :   dulip3ng 
@Version :   1.0
@Desc    :   None
'''

from pages.locator.list_page_locator import ListPageLocator
from pages.base_page import BasePage
from playwright.sync_api import Page, expect

class ListPage(BasePage):
    """
    列表页面模型，适用于普通单据列表页面，如销售订单列表
    """

    def wait_list_loaded(self):
        """
        等待页面加载完成，当页面加载出第一行第一列表格时，停止等待

        **用法：**

        ListPage.wait_list_loaded()

        **注意：**

        1.有时表格加载完成但界面仍存在wait_loading转圈图标，不做处理由playwright自动处理后续元素可操作性检查

        2.默认等待时间受 expect.set_options(timeout=)全局控制

        3.此方法只能检测有数据的列表是否加载完成，因为无数据时不会出现td表格元素，无法区分是否加载完成
        :return:
        """
        expect(self.page.locator(ListPageLocator.WAITING_LOC).first).to_be_visible()

    def click_button(self, button_name: str, sub_button:str=None, grandson_button:str=None):
        """
        点击列表按钮，如“新增”

        **用法：**

        ListPage.click_button("新增")

        ListPage.click_button("新增", "复制")

        ListPage.click_button("选项", "套打", "套打设置")
        :param button_name: 按钮名称
        :param sub_button: 子按钮名称，如”复制“
        :param grandson_button: 三级按钮名称，如”选项>套打>套打设置“
        :return:
        """
        if sub_button is None and grandson_button is None:
            self.page.locator(ListPageLocator.BUTTON_ARGS_LOC % (button_name, 1)).click()
        if sub_button and grandson_button is None:
            self.page.locator(ListPageLocator.BUTTON_ARGS_LOC % (button_name, 1)).hover()
            self.page.locator(ListPageLocator.SUB_BUTTON_ARGS_LOC % sub_button).click()
        if sub_button and grandson_button:
            self.page.locator(ListPageLocator.BUTTON_ARGS_LOC % (button_name, 1)).hover()
            self.page.locator(ListPageLocator.SUB_BUTTON_ARGS_LOC % sub_button).hover()
            self.page.locator(ListPageLocator.GRANDSON_BUTTON_ARGS_LOC % (sub_button, grandson_button)).click()

    def check_line_by_rows(self, *rows: int):
        """
        勾选给定行号

        **用法：**

        ListPage.check_line_by_rows(1)

        ListPage.check_line_by_rows(1,2,3)

        :param rows: 行号，可传多个
        :return:
        """
        self.wait_list_loaded()
        for r in rows:
            self.page.locator(ListPageLocator.ROW_DATA_ARGS_LOC % r).click()

    def open_bill_by_row(self, row: int):
        """
        根据行号打开单据

        **用法：**

        ListPage.open_bill_by_row(1)

        **注意：**

        此方法是通过点击行号的单据编号字段打开单据，确保该行单据编号字段有值
        :param row: 行号
        :return:
        """
        self.wait_list_loaded()
        self.page.locator(ListPageLocator.BILL_NO_FIELD_ARGS_LOC % row).click()

    def get_value(self, field_name:str, row: int):
        """
        获取列表字段值

        **用法：**

        ListPage.get_value("衬衣订单号", 1)

        **注意：**

        单据编号字段无效，可用get_bill_no()
        :param field_name: 字段名
        :param row: 行号
        :return: 字段值
        """
        self.wait_list_loaded()
        return self.page.locator(ListPageLocator.ROW_FIELD_VALUE_ARGS_LOC % (field_name, row)).inner_text()

    def get_bill_no(self, row: int):
        """
        根据行号获取单据编号字段值

        **用法：**

        ListPage.get_bill_no(1)

        **注意：**

        确保给定行号单据编号字段有值
        :param row: 行号
        :return:
        """
        self.wait_list_loaded()
        return self.page.locator(ListPageLocator.BILL_NO_FIELD_VALUE_ARGS_LOC % row).inner_text()

    def get_row_count(self):
        """
        获取列表总行数

        **用法：**

        ListPage.get_row_count()
        :return: 列表行数
        """
        self.wait_list_loaded()
        return self.page.locator(ListPageLocator.LIST_ALL_LINE_LOC).count()

    def check_line_by_field_value(self, field_name:str, value:str):
        """
        根据给定字段名，字段值勾选对应行

        **用法：**

        ListPage.check_line_by_field_value("衬衣订单号", "26022021")

        **注意：**
        当列表中存在多个相同字段值行时，只勾选第一行
        :param field_name: 字段名
        :param value: 字段值
        :return:
        """
        self.wait_list_loaded()
        row = self.page.locator(ListPageLocator.FIELDS_VALUE_ARGS_LOC % (field_name, value)).first.get_attribute('data-rowid')
        self.check_line_by_rows(int(row))

    def field_filter(self, field_name:str, value:str):
        """
        字段过滤，点击列表列名右侧小漏斗，进行列表简单过滤

        **用法：**

        ListPage.field_filter("销售类别", "内销")
        :param field_name: 字段名
        :param value: 过滤值
        :return:
        """
        self.wait_list_loaded()
        self.page.locator(ListPageLocator.FIELD_FILTER_ARGS_LOC % field_name).hover()
        self.page.locator(ListPageLocator.FILTER_ICON_ARGS_LOC % field_name).click()
        self.page.locator(ListPageLocator.FILTER_VALUE_ARGS_LOC % value).click()
        self.page.locator(ListPageLocator.FILTER_OK_BTN).click()


