#!/bin/bash

# 定义接口 1 和接口 2 的 URL
API_1_URL="https://gateway.dev.cdlsxd.cn/voucher/cmb/v1/orderMock"
API_2_URL="https://gateway.dev.cdlsxd.cn/voucher/cmb/v1/order"

# 定义接口 1 请求的公共请求头
API_1_HEADERS=(
    "User-Agent: Apifox/1.0.0 (https://apifox.com)"
    "Content-Type: application/json"
    "Accept: */*"
    "Host: 127.0.0.1:8000"
    "Connection: keep-alive"
)

# 定义接口 2 请求的公共请求头
API_2_HEADERS=(
    "User-Agent: Apifox/1.0.0 (https://apifox.com)"
    "Content-Type: application/json"
    "Accept: */*"
    "Host: 127.0.0.1:8000"
    "Connection: keep-alive"
)

# 压测参数设置
CONCURRENCY=2  # 并发数
QPS=5          # 每秒请求数
DURATION=2     # 压测持续时间（秒）
TOTAL_REQUESTS=$((CONCURRENCY * DURATION))  # 总请求次数

# 计算每次请求的间隔时间（秒）
REQUEST_INTERVAL=$(echo "scale=3; 1 / $QPS" | bc)

# 创建日志目录（自动忽略已存在的目录）
mkdir -p "./log/stress"

# 初始化统计变量
success_count=0
failure_count=0
total_response_time=0
log_file="./log/stress/$(date +%Y%m%d%H%M%S)_stress.log"

# 检查是否安装jq
if ! command -v jq &> /dev/null; then
    echo "错误：未安装jq工具，请先执行 'brew install jq' 安装"
    exit 1
fi

get_time() {
    local t=$(gdate +%s%N)
    echo $((10#${t:0:10} * 1000000000 + 10#${t:10:9}))
}

# 循环执行压测
for ((i = 0; i < TOTAL_REQUESTS; i++)); do
    # 生成随机 transactionId
    transaction_id=$(date +%s)$RANDOM

    # 构建接口 1 请求体
    API_1_BODY=$(cat <<EOF
{
    "transactionId": "$transaction_id",
    "activityId": "001",
    "cmbUid": "oO3vO5K2nE131-9uMoeYymLhlbYk",
    "cmbUidType": "1",
    "timestamp": "19780107024253",
    "appId": "wx9ed74283ad25bca1"
}
EOF
    )

    # 测量接口 1 响应时间（微秒）
    start_time_1=$(get_time)
    response_1=$(curl -s -X POST "${API_1_HEADERS[@]/#/-H }" -d "$API_1_BODY" "$API_1_URL")
    end_time_1=$(get_time)
    duration_1=$(( (end_time_1 - start_time_1) / 1000 ))  # 转换为微秒

    # 解析接口 1 响应
    if [ -z "$response_1" ]; then
        echo "接口 1 请求失败（无响应）" | tee -a "$log_file"
        ((failure_count++))
        continue
    fi

    # 验证JSON格式
    if ! echo "$response_1" | jq -e . >/dev/null 2>&1; then
        echo "接口 1 返回无效JSON" | tee -a "$log_file"
        ((failure_count++))
        continue
    fi

   # 提取code字段并检查存在性
   if echo "$response_1" | jq -e '.code | exists' >/dev/null 2>&1; then
       api1_code=$(echo "$response_1" | jq -r '.code')
       if [ "$api1_code" != "200" ]; then
           echo "接口 1 返回错误：code=$api1_code, 响应=$response_1" | tee -a "$log_file"
           ((failure_count++))
           continue
       fi
   fi

    # 测量接口 2 响应时间
    start_time_2=$(get_time)
    response_2=$(curl -s -X POST "${API_2_HEADERS[@]/#/-H }" -d "$response_1" "$API_2_URL")
    end_time_2=$(get_time)
    duration_2=$(( (end_time_2 - start_time_2) / 1000 ))

    # 记录日志
    echo "[$(date +%Y-%m-%dT%H:%M:%S)] 请求 $((i+1))" | tee -a "$log_file"
    echo "接口 1 响应时间：$duration_1 μs" | tee -a "$log_file"
    echo "接口 2 响应时间：$duration_2 μs" | tee -a "$log_file"
    echo "接口 2 响应内容：$response_2" | tee -a "$log_file"
    echo "----------------------------------------" | tee -a "$log_file"

    # 统计成功次数
    ((success_count++))
    total_response_time=$((total_response_time + duration_2))

    # 控制请求频率
    sleep $REQUEST_INTERVAL
done

# 输出统计结果
echo -e "\n压测统计："
echo "总请求次数: $TOTAL_REQUESTS"
echo "成功次数: $success_count"
echo "失败次数: $failure_count"

if [ $success_count -gt 0 ]; then
    avg_response=$((total_response_time / success_count))
    echo "平均响应时间: $avg_response μs (成功请求)"
else
    echo "平均响应时间: 无成功请求，无法计算"
fi

echo "日志文件: $log_file"