# -*-coding:utf-8 -*- #
# ---------------------------------------------------------------------------
# ProjectName:   test66
# FileName:      request_method.py
# Author:       lao_zhao
# Datetime:     2025/5/9 14:17
# Description:
# 
# ---------------------------------------------------------------------------
import requests
from APIAutoTest_v3 import log_decorator
from APIAutoTest_v3.common.db import DB
from APIAutoTest_v3.common.read_system_ini import ReadSystemIni


class RequestMethod:

    @log_decorator
    def __init__(self):
        """关联被测系统的状态"""
        login_url = ReadSystemIni().get_host("host") + "/auth"
        log_data = {
            "username": "admin",
            "password": "fWwO5OcV0c5AZfgOohpm4OE/FjKMc5wcjjaJvfbnrTIQMG5d3htn2aFA2iZGkSgYZ+9liGgmple6bCp+NT4PnY2Jlov8tV8Q/+nn2IZTuPCMwHqRrUchpPUr4wXWuQ+Gk55DNu4CZgxWQ5HxfzixGHJT29D6TUiz5Ea+mLm3fg8="
          }
        self.bpm_session = requests.sessions.Session()
        self.header = {"Authorization": "Bearer "+self.bpm_session.request(method="post", url=login_url, json=log_data).json().get("token")}
        self.bpm_session.headers.update(self.header)

        self.db = DB()

    @log_decorator
    def request_all(self, req_method, req_url, req_mime, case_data, sql_type, sql_data, update_key):
        """
        封装一个公共的请求方法
        :param req_method: 请求方法
        :param req_url: 请求的url
        :param req_mime: 请求的媒体类型
        :param case_data: 用例数据
        :param sql_type: sql语句类型
        :param sql_data: sql语句
        :param update_key: 更新的key
        :return: Response Type
        """
        # 先执行sql语句---该删除的就删除，如果有查询就需要更新用例数据，更新时，需要注意用例数据的类型
        if sql_type == "delete":
            self.db.delete(sql_data)

        elif sql_type == "select":
            select_result = self.db.select(sql_data)
            if isinstance(case_data, str):
                case_data = case_data.replace(update_key, select_result)
            else:
                case_data[update_key] = select_result

        # 判断sql语句的类型是否为delete|select，或者为select|delete
        elif sql_type == "delete|select" or sql_type == "select|delete":
            # 删除执行删除的sql语句
            self.db.delete(sql_data["delete"])
            # 再执行查询的sql语句，获取查询结果，将查询结果更新到用例数据中
            select_result = self.db.select(sql_data["select"])
            if isinstance(case_data, str):
                case_data = case_data.replace(update_key, select_result)
            else:
                case_data[update_key] = select_result

        # 后发送请求--判断媒体类型，不同的媒体类型使用不同的关键字传参
        if req_mime == "json" or req_mime == "application/json":
            self.bpm_session.headers["content-type"] = "application/json"
            if isinstance(case_data, str):
                # 除了上传文件-files和发送python对象给服务器-json，以外的所以数据如果要在请求体中发送给服务器，全部使用data发送给服务器。
                return self.bpm_session.request(method=req_method, url=req_url, data=case_data)
            else:
                return self.bpm_session.request(method=req_method, url=req_url, json=case_data)

        elif req_mime == "text" or req_mime == "text/plain":
            self.bpm_session.headers["content-type"] = "text/plain"
            return self.bpm_session.request(method=req_method, url=req_url, data=case_data)

        elif req_mime == "form" or req_mime == "x-www-form-urlencoded" or req_mime == "application/x-www-form-urlencoded":
            self.bpm_session.headers["content-type"] = "application/x-www-form-urlencoded"
            return self.bpm_session.request(method=req_method, url=req_url, data=case_data)

        elif req_mime == "query":
            return self.bpm_session.request(method=req_method, url=req_url, params=case_data)

        # 判断媒体类型是否为query|json或者为json|query,表示请求体和地址栏同时传参
        elif req_mime == "query|json" or req_mime == "json|query":
            # 先取出请求体和地址栏传参的数据
            body = case_data.get("body")
            query = case_data.get("query")
            # 更改请求的媒体类型
            self.bpm_session.headers["content-type"] = "application/json"
            # 判断请求的数据类型是否为字符串，如果是使用data传参，如果不是使用json传参
            if isinstance(body, str):
                return self.bpm_session.request(method=req_method, url=req_url, data=body, params=query)
            else:
                return self.bpm_session.request(method=req_method, url=req_url, json=body, params=query)

        elif req_mime is None:
            return self.bpm_session.request(method=req_method, url=req_url)

        elif req_mime == "multipart/form-data" or req_mime == "form-data":
            # 更新下用例数据，需要注意上传文件的参数名
            return requests.request(method=req_method, url=req_url, files=case_data, headers=self.header)

        else:
            raise ValueError("媒体类型错误")