import openpyxl

from API2 import log_decorator
from API2.common.read_json import read_json
from API2.common.read_system_ini import ReadSystemIni
from API2.common.read_user_ini import ReadUserIni


class ReadExcel:
    @log_decorator
    def __init__(self,username):
        """获取excel的路径及工作表的名称，加载工作簿获取工作表；获取所以json文件的路径，获取json文件内容的python对象"""
        # self.ini=ReadIni()
        self.system_ini=ReadSystemIni()
        #获取用户
        self.ini=ReadUserIni(username)
        #获取excel和工作表的名称
        excel_path=self.ini.get_file_path('excel')
        table_name=self.ini.get_table_name('table_name')
        #获取所有的json文件
        case_data_path=self.ini.get_file_path("case")
        expect_data_path=self.ini.get_file_path("expect")
        sql_data_path=self.ini.get_file_path("sql")

        #调用read_json读取json文件
        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)

        #获取工作表
        wb=openpyxl.load_workbook(excel_path)
        self.ws=wb[table_name]

    @log_decorator
    def __get_cell_value(self,column,row):
        """获取指定单元格数据"""
        value=self.ws[column+str(row)].value
        if isinstance(value,str) and len(value.strip())>0:
            return value.strip()

    @log_decorator
    def module_name(self,row):
        """根据行，获取模块名称"""
        return self.__get_cell_value('b',row)

    @log_decorator
    def api_name(self,row):
        """根据行，获取接口名称"""
        return self.__get_cell_value('c',row)

    @log_decorator
    def case_req(self,row):
        """根据行，获取请求方法"""
        return self.__get_cell_value('f',row)

    @log_decorator
    def case_url(self,row):
        """根据行，获取请求的url"""
        value=self.__get_cell_value('g',row)
        if value:
            # return self.ini.get_host("host")+value
            return self.system_ini.get_host("host")+value

    @log_decorator
    def case_mime(self,row):
        """根据行，获取请求的媒体类型"""
        value=self.__get_cell_value('h',row)
        if value:
            return value.lower()

    @log_decorator
    def case_data(self,row):
        """根据行，获取用例数据"""
        case_data_key=self.__get_cell_value('i',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]

    @log_decorator
    def expect_data(self,row):
        """根据行，获取期望数据"""
        expect_data_key=self.__get_cell_value('j',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]

    @log_decorator
    def sql_data(self,row):
        """根据行，获取sql语句的key"""
        sql_data_key=self.__get_cell_value('l',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]

    @log_decorator
    def sql_type(self,row):
        """根据行，获取sql类型"""
        value=self.__get_cell_value('k',row)
        if value:
            return value.lower()

    @log_decorator
    def updata_key(self,row):
        """根据行，获取需要更新的key"""
        return self.__get_cell_value('m',row)

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

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

    @log_decorator
    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)
            req=self.case_req(row)
            url=self.case_url(row)
            mime=self.case_mime(row)
            case=self.case_data(row)
            expect=self.expect_data(row)
            sql_type=self.sql_type(row)
            sql=self.sql_data(row)
            updata_key=self.updata_key(row)
            if url and req and expect:
                list_data.append([module, api, title, level,req,url,mime,case,expect,sql_type,sql,updata_key])
        else:
            return list_data

if __name__ == '__main__':
    excel = ReadExcel()
    # excel.get_data()
    print(excel.get_data(),end='\t')