#!/bin/bash
# ============================================================
# 智秤未来 - PHP 后台接口测试脚本
# 用法：bash test_api.sh
# ============================================================

# ==================== 配置 ====================
BASE_URL="https://origincard.cn/weigh_scale_api/api"
ORGID=1
PHONE="13660683094"
PASSWORD="123456"


# 统计变量
TOTAL=0
PASS=0
FAIL=0
FAIL_LIST=()

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# ==================== 工具函数 ====================

# 打印标题
print_title() {
    echo ""
    echo -e "${BLUE}========================================${NC}"
    echo -e "${BLUE}  $1${NC}"
    echo -e "${BLUE}========================================${NC}"
}

# 断言：code == 200
assert_success() {
    local name="$1"
    local response="$2"
    TOTAL=$((TOTAL + 1))

    local code=$(echo "$response" | jq -r '.code // "null"')
    local message=$(echo "$response" | jq -r '.message // "无消息"')

    if [ "$code" == "200" ]; then
        echo -e "${GREEN}✅ PASS${NC} | $name | code=$code | $message"
        PASS=$((PASS + 1))
    else
        echo -e "${RED}❌ FAIL${NC} | $name | code=$code | $message"
        echo -e "   ${YELLOW}响应: $(echo $response | head -c 200)${NC}"
        FAIL=$((FAIL + 1))
        FAIL_LIST+=("$name")
    fi
}

# 断言：code == 期望值
assert_code() {
    local name="$1"
    local response="$2"
    local expected="$3"
    TOTAL=$((TOTAL + 1))

    local code=$(echo "$response" | jq -r '.code // "null"')
    local message=$(echo "$response" | jq -r '.message // "无消息"')

    if [ "$code" == "$expected" ]; then
        echo -e "${GREEN}✅ PASS${NC} | $name | code=$code | $message"
        PASS=$((PASS + 1))
    else
        echo -e "${RED}❌ FAIL${NC} | $name | 期望 code=$expected，实际 code=$code | $message"
        FAIL=$((FAIL + 1))
        FAIL_LIST+=("$name")
    fi
}

# 断言：字段存在
assert_field() {
    local name="$1"
    local response="$2"
    local field="$3"
    TOTAL=$((TOTAL + 1))

    local value=$(echo "$response" | jq -r "$field // \"null\"")
    if [ "$value" != "null" ] && [ "$value" != "" ]; then
        echo -e "${GREEN}✅ PASS${NC} | $name | $field = $value"
        PASS=$((PASS + 1))
    else
        echo -e "${RED}❌ FAIL${NC} | $name | 字段 $field 不存在或为空"
        FAIL=$((FAIL + 1))
        FAIL_LIST+=("$name")
    fi
}

# ============================================================
# 一、登录相关测试
# ============================================================

print_title "1. 登录接口测试"

# 1.1 密码登录 - 成功
echo "测试 1.1: 密码登录（正确密码）"
LOGIN_RESP=$(curl -s -X POST "$BASE_URL/login.php" \
    -d "phone=$PHONE&password=$PASSWORD")
assert_success "密码登录-成功" "$LOGIN_RESP"

# 提取 Token
TOKEN=$(echo "$LOGIN_RESP" | jq -r '.data.token // ""')
echo "   提取的 Token: ${TOKEN:0:30}..."

# 1.2 密码登录 - 错误密码
echo "测试 1.2: 密码登录（错误密码）"
WRONG_LOGIN=$(curl -s -X POST "$BASE_URL/login.php" \
    -d "phone=$PHONE&password=wrongpwd")
assert_code "密码登录-错误密码" "$WRONG_LOGIN" "400"

# 1.3 密码登录 - 手机号不存在
echo "测试 1.3: 密码登录（手机号不存在）"
NOUSER_LOGIN=$(curl -s -X POST "$BASE_URL/login.php" \
    -d "phone=13800138001&password=123456")
assert_code "密码登录-手机号不存在" "$NOUSER_LOGIN" "404"

# 1.4 一键登录
echo "测试 1.4: 一键登录"
ONEKEY_RESP=$(curl -s -X POST "$BASE_URL/login_one_key.php" \
    -d "phone=$PHONE")
assert_success "一键登录" "$ONEKEY_RESP"

# 1.5 发送验证码
echo "测试 1.5: 发送验证码"
CODE_RESP=$(curl -s -X POST "$BASE_URL/send_code.php" \
    -d "phone=$PHONE&type=login")
assert_success "发送验证码" "$CODE_RESP"

# 1.6 验证码登录
echo "测试 1.6: 验证码登录"
VERIFY_LOGIN=$(curl -s -X POST "$BASE_URL/login_verify.php" \
    -d "phone=$PHONE&code=123456")
assert_success "验证码登录" "$VERIFY_LOGIN"

# 1.7 验证 Token
echo "测试 1.7: 验证 Token"
if [ -n "$TOKEN" ]; then
    CHECK_TOKEN=$(curl -s -X GET "$BASE_URL/check_token.php" \
        -H "Authorization: Bearer $TOKEN")
    assert_success "验证Token" "$CHECK_TOKEN"
fi

# ============================================================
# 二、工人管理测试
# ============================================================

print_title "2. 工人管理测试"

# 2.1 获取员工列表
echo "测试 2.1: 获取员工列表"
EMP_LIST=$(curl -s -X GET "$BASE_URL/get_employees.php?orgid=$ORGID&deptid=0")
assert_success "获取员工列表" "$EMP_LIST"

# 2.2 获取部门列表
echo "测试 2.2: 获取部门列表"
DEPT_LIST=$(curl -s -X GET "$BASE_URL/get_departments.php?orgid=$ORGID")
assert_success "获取部门列表" "$DEPT_LIST"

# 2.3 添加工人
echo "测试 2.3: 添加工人"
ADD_EMP=$(curl -s -X POST "$BASE_URL/add_employee.php" \
    -d "empcode=TEST001&empname=测试工人&gender=1&orgid=$ORGID&deptid=1&status=1&base_salary=100&weigh_mode=1")
assert_success "添加工人" "$ADD_EMP"

# 2.4 更新工人
echo "测试 2.4: 更新工人"
UPDATE_EMP=$(curl -s -X POST "$BASE_URL/update_employee.php" \
    -d "empid=1&empcode=TEST001&empname=测试工人改&gender=1&orgid=$ORGID&deptid=1&status=1&base_salary=100&weigh_mode=1")
assert_success "更新工人" "$UPDATE_EMP"

# 2.5 删除工人
echo "测试 2.5: 删除工人"
DELETE_EMP=$(curl -s -X POST "$BASE_URL/delete_employee.php" \
    -d "empid=1&orgid=$ORGID")
assert_success "删除工人" "$DELETE_EMP"

# ============================================================
# 三、类别管理测试
# ============================================================

print_title "3. 类别管理测试"

# 3.1 获取类别列表
echo "测试 3.1: 获取类别列表"
CAT_LIST=$(curl -s -X GET "$BASE_URL/get_categories.php?orgid=$ORGID")
assert_success "获取类别列表" "$CAT_LIST"

# 3.2 添加类别
echo "测试 3.2: 添加类别"
ADD_CAT=$(curl -s -X POST "$BASE_URL/add_category.php" \
    -d "catename=测试类别&orgid=$ORGID")
assert_success "添加类别" "$ADD_CAT"

# 3.3 修改类别
echo "测试 3.3: 修改类别"
UPDATE_CAT=$(curl -s -X POST "$BASE_URL/update_category.php" \
    -d "cateid=1&catename=测试类别改&orgid=$ORGID")
assert_success "修改类别" "$UPDATE_CAT"

# 3.4 删除类别
echo "测试 3.4: 删除类别"
DELETE_CAT=$(curl -s -X POST "$BASE_URL/delete_category.php" \
    -d "cateid=1&orgid=$ORGID")
assert_success "删除类别" "$DELETE_CAT"

# ============================================================
# 四、产品管理测试
# ============================================================

print_title "4. 产品管理测试"

# 4.1 获取产品列表
echo "测试 4.1: 获取产品列表"
PROD_LIST=$(curl -s -X GET "$BASE_URL/get_products.php?orgid=$ORGID&cateid=0")
assert_success "获取产品列表" "$PROD_LIST"

# 4.2 获取单位列表
echo "测试 4.2: 获取单位列表"
UNIT_LIST=$(curl -s -X GET "$BASE_URL/get_units.php")
assert_success "获取单位列表" "$UNIT_LIST"

# 4.3 获取模式列表
echo "测试 4.3: 获取模式列表"
MODE_LIST=$(curl -s -X GET "$BASE_URL/get_modes.php")
assert_success "获取模式列表" "$MODE_LIST"

# 4.4 添加产品
echo "测试 4.4: 添加产品"
ADD_PROD=$(curl -s -X POST "$BASE_URL/add_product.php" \
    -d "productcode=TESTP001&productname=测试产品&orgid=$ORGID&cateid=1&price=1.5&unitid=1&modeid=1&mark=测试")
assert_success "添加产品" "$ADD_PROD"

# 4.5 修改产品
echo "测试 4.5: 修改产品"
UPDATE_PROD=$(curl -s -X POST "$BASE_URL/update_product.php" \
    -d "productid=1&productcode=TESTP001&productname=测试产品改&orgid=$ORGID&cateid=1&price=2.0&unitid=1&modeid=1&mark=测试改")
assert_success "修改产品" "$UPDATE_PROD"

# 4.6 删除产品
echo "测试 4.6: 删除产品"
DELETE_PROD=$(curl -s -X POST "$BASE_URL/delete_product.php" \
    -d "productid=1&orgid=$ORGID")
assert_success "删除产品" "$DELETE_PROD"

# ============================================================
# 五、计量台账测试
# ============================================================

print_title "5. 计量台账测试"

# 5.1 查询台账
echo "测试 5.1: 查询计量台账"
TODAY=$(date +%Y-%m-%d)
LEDGER=$(curl -s -X GET "$BASE_URL/get_measurement_ledger.php?orgid=$ORGID&start_date=$TODAY&end_date=$TODAY&empcode=EMP00003")
assert_success "查询计量台账" "$LEDGER"

# ============================================================
# 六、结算查询测试
# ============================================================

print_title "6. 结算查询测试"

# 6.1 按员工统计
echo "测试 6.1: 结算查询-按员工"
PAY_EMP=$(curl -s -X GET "$BASE_URL/get_payment_search.php?orgid=$ORGID&start_date=$TODAY&end_date=$TODAY&stat_type=employee")
assert_success "结算查询-按员工" "$PAY_EMP"

# 6.2 按日期统计
echo "测试 6.2: 结算查询-按日期"
PAY_DATE=$(curl -s -X GET "$BASE_URL/get_payment_search.php?orgid=$ORGID&start_date=$TODAY&end_date=$TODAY&stat_type=date")
assert_success "结算查询-按日期" "$PAY_DATE"

# ============================================================
# 七、工资结算测试
# ============================================================

print_title "7. 工资结算测试"

# 7.1 查询工资
echo "测试 7.1: 查询工资结算"
WAGE=$(curl -s -X GET "$BASE_URL/get_wage_settlement.php?orgid=$ORGID&empcode=EMP00003&start_date=$TODAY&end_date=$TODAY")
assert_success "工资结算" "$WAGE"

# ============================================================
# 八、生产日报测试
# ============================================================

print_title "8. 生产日报测试"

# 8.1 统计概览
echo "测试 8.1: 生产日报-概览"
REPORT_OV=$(curl -s -X GET "$BASE_URL/get_daily_report.php?orgid=$ORGID&report_date=$TODAY&report_type=overview")
assert_success "日报-概览" "$REPORT_OV"

# 8.2 品类统计
echo "测试 8.2: 生产日报-品类"
REPORT_CAT=$(curl -s -X GET "$BASE_URL/get_daily_report.php?orgid=$ORGID&report_date=$TODAY&report_type=category")
assert_success "日报-品类" "$REPORT_CAT"

# ============================================================
# 九、VIP 服务续费测试
# ============================================================

print_title "9. VIP服务续费测试"

# 9.1 获取 VIP 记录
echo "测试 9.1: 获取VIP记录"
VIP=$(curl -s -X GET "$BASE_URL/get_vip_service.php?orgid=$ORGID")
assert_success "获取VIP记录" "$VIP"

# ============================================================
# 十、账号与安全测试
# ============================================================

print_title "10. 账号与安全测试"

# 10.1 查询是否有密码
echo "测试 10.1: 查询是否有密码"
if [ -n "$TOKEN" ]; then
    HAS_PWD=$(curl -s -X POST "$BASE_URL/has_password.php" \
        -H "Authorization: Bearer $TOKEN")
    assert_success "查询是否有密码" "$HAS_PWD"

    # 10.2 修改密码（原密码方式）
    echo "测试 10.2: 修改密码-原密码"
    CHANGE_PWD=$(curl -s -X POST "$BASE_URL/change_password.php" \
        -H "Authorization: Bearer $TOKEN" \
        -d "old_password=$PASSWORD&new_password=123456")
    assert_success "修改密码-原密码" "$CHANGE_PWD"

    # 10.3 改回原密码
    echo "测试 10.3: 改回原密码"
    CHANGE_BACK=$(curl -s -X POST "$BASE_URL/change_password.php" \
        -H "Authorization: Bearer $TOKEN" \
        -d "old_password=123456&new_password=$PASSWORD")
    assert_success "改回原密码" "$CHANGE_BACK"
fi

# 10.4 修改密码-验证码方式
echo "测试 10.4: 修改密码-验证码方式"
CHANGE_VERIFY=$(curl -s -X POST "$BASE_URL/change_password_by_verify.php" \
    -d "phone=$PHONE&code=123456&new_password=123456")
assert_success "修改密码-验证码" "$CHANGE_VERIFY"

# ============================================================
# 十一、帮助与反馈测试
# ============================================================

print_title "11. 帮助与反馈测试"

# 11.1 获取反馈类型
echo "测试 11.1: 获取反馈类型"
FEEDBACK_TYPE=$(curl -s -X GET "$BASE_URL/get_feedback_type.php")
assert_success "获取反馈类型" "$FEEDBACK_TYPE"

# 11.2 提交反馈
echo "测试 11.2: 提交反馈"
if [ -n "$TOKEN" ]; then
    SUBMIT_FB=$(curl -s -X POST "$BASE_URL/submit_feedback.php" \
        -H "Authorization: Bearer $TOKEN" \
        -d "type=0&typeid=1&content=这是一条测试反馈内容")
    assert_success "提交反馈" "$SUBMIT_FB"
fi

# ============================================================
# 十二、退出登录测试
# ============================================================

print_title "12. 退出登录测试"

# 12.1 退出登录
echo "测试 12.1: 退出登录"
if [ -n "$TOKEN" ]; then
    LOGOUT=$(curl -s -X POST "$BASE_URL/logout.php" \
        -H "Authorization: Bearer $TOKEN")
    assert_success "退出登录" "$LOGOUT"
fi

# ============================================================
# 测试结果汇总
# ============================================================

print_title "测试结果汇总"

echo ""
echo -e "${BLUE}总测试数:${NC} $TOTAL"
echo -e "${GREEN}通过:${NC}    $PASS"
echo -e "${RED}失败:${NC}    $FAIL"
echo ""

if [ $FAIL -gt 0 ]; then
    echo -e "${RED}失败的测试:${NC}"
    for item in "${FAIL_LIST[@]}"; do
        echo "  - $item"
    done
    echo ""
    exit 1
else
    echo -e "${GREEN}🎉 全部通过！${NC}"
    exit 0
fi