import openpyxl
from v3 import log,loger
from v3.read_data.Readbasicini import *
from v3.read_data.Readuserini import *
from v3.read_data.read_json import *
class Readexcel:
    @loger
    def __init__(self, user):
        ini = Readuserini(user)
        case_data_path = ini.get_file_path("case")
        expect_data_path = ini.get_file_path("expect")
        sql_data_path = ini.get_file_path("sql")
        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_path = ini.get_file_path("excel")
        tabel_name = ini.get_table_name("name")
        try:
            wb = openpyxl.load_workbook(excel_path)
            self.ws = wb[tabel_name]
        except Exception as e:
            #log.error(f"excel表存在问题，问题是:{e}，问题类型是:{type(e)}")
            raise e

    def __get_cell_value(self, column:str, row:int):
        log.info(f"根据列号行号读取指定单元格的数据，列号为：{column}，行号为{row}")
        try:
            cell = self.ws[str(column) + str(row)]
            cell_value = cell.value
        except Exception as e:
            log.error(f"单元格{str(column)+str(row)}中的数据存在问题，问题时:{e}，问题类型是:{type(e)}")
            raise e
        else:
            if cell_value == None:
                return None
            elif cell_value.strip():
                return cell_value.strip()

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

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

    def case_title(self,row):
        log.info(f"执行的方法为：case_title，功能描述为：根据行号，获取用例标题，传入的参数为：{row}行")
        return self.__get_cell_value("d",row)

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

    def case_req_url(self,row):
        log.info(f"执行的方法为：req_url，功能描述为：根据行号，获取用例的请求url，传入的参数为：{row}行")
        path=self.__get_cell_value("g", row)
        if path:
            return Readbasicini().get_host("bpm")+path

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

    def get_case_data(self,row):
        log.info(f"执行的方法为：case_data，功能描述为：根据行号，获取用例数据，传入的参数为：{row}行")
        case_data_key=self.__get_cell_value("i",row)
        case_module_name=self.case_module_name(row)
        case_api_name=self.case_api_name(row)
        if case_api_name and case_module_name and case_data_key:
            #根据excel表拿到用例数据的key,在去读取json中读取key对应的value——当作字典使用
            return self.case_data_dict[case_module_name][case_api_name][case_data_key]
        else:
            log.error(f"第{row}行用例数据有缺损")

    def get_expect_data(self,row):
        log.info(f"执行的方法为：expect_data，功能描述为：根据行号，获取用例数据，传入的参数为：{row}行")
        expect_data_key=self.__get_cell_value("j",row)
        expect_module_name=self.case_module_name(row)
        expect_api_name=self.case_api_name(row)
        if expect_data_key and expect_module_name and expect_api_name:
            return self.expect_data_dict[expect_module_name][expect_api_name][expect_data_key]
        else:
            log.error(f"第{row}行期望数据有缺损")

    def get_sql_data(self,row):
        log.info(f"执行的方法为：sql_data，功能描述为：根据行号，获取sql语句，传入的参数为：{row}行")
        sql_data_key=self.__get_cell_value("l",row)
        sql_module_name,sql_api_name=self.case_module_name(row),self.case_api_name(row)
        if sql_data_key and sql_module_name and sql_api_name:
            return self.sql_data_dict[sql_module_name][sql_api_name][sql_data_key]

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

    def get_sql_update(self,row):
        log.info(f"执行的方法为：update_key，功能描述为：根据行号，获取用例的更新的key，传入的参数为：{row}行")
        sql_update=self.__get_cell_value("M",row)

    def get_data(self):
        data_list=[]
        #跳过第一行标题
        for row in range(2,self.ws.max_row+1):
            req_method=self.case_req_method(row)
            req_url=self.case_req_url(row)
            req_media=self.case_req_media(row)
            case_data=self.get_case_data(row)
            expect_data=self.get_expect_data(row)
            sql_data=self.get_sql_data(row)
            sql_type=self.get_sql_type(row)
            sql_update=self.get_sql_update(row)
            if req_method and req_url and expect_data:
                data_list.append([req_method,req_url,req_media,case_data,expect_data,sql_data,sql_type,sql_update])
        else:
            return data_list


if __name__=="__main__":
    excel=Readexcel()
    data=excel.get_data()
    print(data)


