# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test63
# FileName:      read_excel.py
# Author:       lao_zhao
# Datetime:     2024/11/5 14:34
# Description:
# 
# ---------------------------------------------------------------------------
import openpyxl

from APIAutoTest_v3_1 import log, logor
from APIAutoTest_v3_1.common.read_basic_ini import ReadBasicIni
from APIAutoTest_v3_1.common.read_user_ini import ReadUserIni
from APIAutoTest_v3_1.common.read_json import read_json
from APIAutoTest_v3_1.data_config.settings import *


class ReadExcel:
    @logor
    def __init__(self, user):
        """读取所有的json文件,获取excel的工作簿和工作表"""
        # 读取指定用户的ini文件
        ini = ReadUserIni(user)

        # 获取指定用户的存放数据的json文件路径
        case_data_path = ini.get_file_path(CASE_NAME)
        expect_data_path = ini.get_file_path(EXPECT_NAME)
        sql_data_path = ini.get_file_path(SQL_NAME)

        self.case_data_dict = read_json(case_data_path)
        self.expect_data_dict = read_json(expect_data_path)
        self.sql_data_dict = read_json(sql_data_path)

        # 获取指定用户的excel文件路径
        excel_path = ini.get_file_path(EXCEL_NAME)
        # 获取指定用户的工作表名称
        table_name = ini.get_table_name(TABLE_NAME)

        try:
            wb = openpyxl.load_workbook(excel_path)
            self.ws = wb[table_name]
        except Exception as e:
            # log.error(f"获取excel的工作簿或工作表出错,excel的路径为:{excel_path},工作表名称为:{table_name},错误的类型为:{type(e)}, 错误的描述为:{e}")
            raise e

    @logor
    def __get_cell_value(self, column: str, row: int) -> str:
        """获取指定单元格数据"""
        # log.info(f"执行的方法为:__get_cell_value,功能描述为:获取指定单元格数据,传入的参数为:{column}列,{row}行")
        try:
            cell_value = self.ws[column+str(row)].value
        except Exception as e:
            # log.error(f"执行的方法为:__get_cell_value,功能描述为:获取指定单元格数据,传入的参数为:{column}列,{row}行, 报错,错误类型为:{type(e)}, 错误的描述为:{e}")
            raise e
        else:
            if cell_value is None:
                return None
            elif cell_value.strip():
                return cell_value.strip()

    @logor
    def module_name(self, row):
        """根据行号,获取模块名称"""
        # log.info(f"执行的方法为:module_name,功能描述为:根据行号,获取模块名称,传入的参数为:{row}行")
        return self.__get_cell_value(MODULE, row)

    @logor
    def api_name(self, row):
        """根据行号,获取接口名称"""
        # log.info(f"执行的方法为:api_name,功能描述为:根据行号,获取接口名称,传入的参数为:{row}行")
        return self.__get_cell_value(API, row)

    @logor
    def req_method(self, row):
        """根据行号,获取用例的请求方法"""
        # log.info(f"执行的方法为:req_method,功能描述为:根据行号,获取用例的请求方法,传入的参数为:{row}行")
        return self.__get_cell_value(METHOD, row)

    @logor
    def req_url(self, row):
        """根据行号,获取用例的请求url"""
        # log.info(f"执行的方法为:req_url,功能描述为:根据行号,获取用例的请求url,传入的参数为:{row}行")
        path = self.__get_cell_value(PATH, row)
        if path:
            # 创建ReadBasicIni类对象,调用get_host获取被测系统的域名,在和接口路径拼接完整的url
            return ReadBasicIni().get_host(HOST_NAME) + path

    @logor
    def req_mime(self, row):
        """根据行号,获取用例的请求媒体类型"""
        # log.info(f"执行的方法为:req_mime,功能描述为:根据行号,获取用例的请求媒体类型,传入的参数为:{row}行")
        mime = self.__get_cell_value(MIME, row)
        if mime:
            return mime.lower()

    @logor
    def case_data(self, row):
        """根据行号,获取用例数据"""
        # log.info(f"执行的方法为:case_data,功能描述为:根据行号,获取用例数据,传入的参数为:{row}行")
        case_data_key = self.__get_cell_value(CASE, row)
        module_name = self.module_name(row)
        api_name = self.api_name(row)
        if case_data_key and module_name and api_name:
            return self.case_data_dict[module_name][api_name][case_data_key]

    @logor
    def expect_data(self, row):
        """根据行号,获取期望数据"""
        # log.info(f"执行的方法为:expect_data,功能描述为:根据行号,获取期望数据,传入的参数为:{row}行")
        expect_data_key = self.__get_cell_value(EXPECT, row)
        module_name = self.module_name(row)
        api_name = self.api_name(row)
        if expect_data_key and module_name and api_name:
            return self.expect_data_dict[module_name][api_name][expect_data_key]

    @logor
    def sql_type(self, row):
        """根据行号,获取sql语句类型"""
        # log.info(f"执行的方法为:sql_type,功能描述为:根据行号,获取sql语句类型,传入的参数为:{row}行")
        value = self.__get_cell_value(SQLTYPE, row)
        if value:
            return value.lower()

    @logor
    def sql_data(self, row):
        """根据行号,获取sql语句"""
        # log.info(f"执行的方法为:sql_data,功能描述为:根据行号,获取sql语句,传入的参数为:{row}行")
        sql_data_key = self.__get_cell_value(SQL, row)
        module_name = self.module_name(row)
        api_name = self.api_name(row)
        if sql_data_key and module_name and api_name:
            return self.sql_data_dict[module_name][api_name][sql_data_key]

    @logor
    def update_key(self, row):
        """根据行号,获取用例的更新的key"""
        # log.info(f"执行的方法为:update_key,功能描述为:根据行号,获取用例的更新的key,传入的参数为:{row}行")
        return self.__get_cell_value(UPDATEKEY, row)

    @logor
    def case_title(self, row):
        """根据行,获取用例的标题"""
        return self.__get_cell_value(TITLE, row)

    @logor
    def case_level(self, row):
        """根据行获取用例的等级"""
        return self.__get_cell_value(LEVEL, row)

    @logor
    def get_data(self):
        """将测试使用到的数据存放在二维列表中"""
        list_data = []
        for row in range(2, self.ws.max_row+1):
            module = self.module_name(row)
            api = self.api_name(row)
            title = self.case_title(row)
            level = self.case_level(row)
            method = self.req_method(row)
            url = self.req_url(row)
            mime = self.req_mime(row)
            case_data = self.case_data(row)
            expect_data = self.expect_data(row)
            sql_type = self.sql_type(row)
            sql_data = self.sql_data(row)
            update_key = self.update_key(row)
            if method and url and expect_data:
                list_data.append([module, api, title, level, method, url, mime, case_data, expect_data, sql_type, sql_data, update_key])
        else:
            return list_data


if __name__ == '__main__':
    excel = ReadExcel("zs_data")
    print(excel.get_data())