#!/bin/bash

# 文件管理系統測試腳本

BASE_URL="http://localhost:8000/api/documents"

echo "========================================="
echo "ISO 27001 文件管理系統 - API 測試"
echo "========================================="
echo ""

# 顏色定義
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 測試結果統計
TOTAL_TESTS=0
PASSED_TESTS=0
FAILED_TESTS=0

# 測試函數
test_api() {
    TOTAL_TESTS=$((TOTAL_TESTS + 1))
    local test_name="$1"
    local method="$2"
    local endpoint="$3"
    local data="$4"
    
    echo -n "測試 $TOTAL_TESTS: $test_name ... "
    
    if [ -z "$data" ]; then
        response=$(curl -s -w "\n%{http_code}" -X "$method" "$BASE_URL$endpoint" \
            -H "Content-Type: application/json")
    else
        response=$(curl -s -w "\n%{http_code}" -X "$method" "$BASE_URL$endpoint" \
            -H "Content-Type: application/json" \
            -d "$data")
    fi
    
    http_code=$(echo "$response" | tail -n 1)
    body=$(echo "$response" | sed '$d')
    
    if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then
        echo -e "${GREEN}✓ 通過${NC} (HTTP $http_code)"
        PASSED_TESTS=$((PASSED_TESTS + 1))
        return 0
    else
        echo -e "${RED}✗ 失敗${NC} (HTTP $http_code)"
        echo "   回應: $body"
        FAILED_TESTS=$((FAILED_TESTS + 1))
        return 1
    fi
}

echo "=== 1. 文件類別測試 ==="
echo ""

# 測試 1: 取得文件統計
test_api "取得文件統計" "GET" "/documents/statistics/"

# 測試 2: 取得待簽署文件
test_api "取得待簽署文件" "GET" "/documents/pending_acknowledgment/"

# 測試 3: 取得需審查文件
test_api "取得需審查文件" "GET" "/documents/review_due/"

echo ""
echo "=== 2. 文件 CRUD 測試 ==="
echo ""

# 測試 4: 建立新文件
DOC_DATA='{
  "title": "資訊安全政策",
  "category": "policy",
  "content": "# 資訊安全政策\n\n## 一、目的\n本政策旨在保護組織資訊資產...",
  "review_cycle_months": 12
}'

response=$(curl -s -X POST "$BASE_URL/documents/" \
    -H "Content-Type: application/json" \
    -d "$DOC_DATA")

DOC_ID=$(echo "$response" | grep -o '"id":[0-9]*' | grep -o '[0-9]*' | head -1)

if [ -n "$DOC_ID" ]; then
    echo -e "測試 4: 建立新文件 ... ${GREEN}✓ 通過${NC} (ID: $DOC_ID)"
    TOTAL_TESTS=$((TOTAL_TESTS + 1))
    PASSED_TESTS=$((PASSED_TESTS + 1))
else
    echo -e "測試 4: 建立新文件 ... ${RED}✗ 失敗${NC}"
    echo "   無法取得文件 ID"
    TOTAL_TESTS=$((TOTAL_TESTS + 1))
    FAILED_TESTS=$((FAILED_TESTS + 1))
fi

# 測試 5: 取得文件列表
test_api "取得文件列表" "GET" "/documents/"

# 測試 6: 取得單一文件
if [ -n "$DOC_ID" ]; then
    test_api "取得文件詳情" "GET" "/documents/$DOC_ID/"
fi

# 測試 7: 更新文件
if [ -n "$DOC_ID" ]; then
    UPDATE_DATA='{
      "title": "資訊安全政策（修訂版）",
      "content": "# 資訊安全政策\n\n## 一、目的\n本政策旨在保護組織資訊資產，確保機密性、完整性與可用性..."
    }'
    test_api "更新文件" "PATCH" "/documents/$DOC_ID/" "$UPDATE_DATA"
fi

echo ""
echo "=== 3. 文件工作流測試 ==="
echo ""

# 測試 8: 提交審查
if [ -n "$DOC_ID" ]; then
    test_api "提交文件審查" "POST" "/documents/$DOC_ID/submit_for_review/" '{}'
fi

# 測試 9: 核准文件
if [ -n "$DOC_ID" ]; then
    test_api "核准文件" "POST" "/documents/$DOC_ID/approve/" '{}'
fi

# 測試 10: 發布文件
if [ -n "$DOC_ID" ]; then
    PUBLISH_DATA='{"change_summary": "首次發布"}'
    test_api "發布文件" "POST" "/documents/$DOC_ID/publish/" "$PUBLISH_DATA"
fi

# 測試 11: 簽署文件
if [ -n "$DOC_ID" ]; then
    test_api "簽署文件" "POST" "/documents/$DOC_ID/acknowledge/" '{}'
fi

echo ""
echo "=== 4. 文件版本測試 ==="
echo ""

# 測試 12: 取得文件版本
if [ -n "$DOC_ID" ]; then
    test_api "取得文件版本歷史" "GET" "/documents/$DOC_ID/versions/"
fi

# 測試 13: 取得簽署記錄
if [ -n "$DOC_ID" ]; then
    test_api "取得簽署記錄" "GET" "/documents/$DOC_ID/acknowledgments/"
fi

echo ""
echo "=== 5. 文件篩選測試 ==="
echo ""

# 測試 14: 依分類篩選
test_api "依分類篩選（政策）" "GET" "/documents/?category=policy"

# 測試 15: 依狀態篩選
test_api "依狀態篩選（已發布）" "GET" "/documents/?status=published"

# 測試 16: 搜尋文件
test_api "搜尋文件" "GET" "/documents/?search=資訊安全"

echo ""
echo "=== 6. 清理測試資料 ==="
echo ""

# 測試 17: 刪除測試文件
if [ -n "$DOC_ID" ]; then
    test_api "刪除測試文件" "DELETE" "/documents/$DOC_ID/"
fi

echo ""
echo "========================================="
echo "測試結果總結"
echo "========================================="
echo -e "總測試數: $TOTAL_TESTS"
echo -e "${GREEN}通過: $PASSED_TESTS${NC}"
echo -e "${RED}失敗: $FAILED_TESTS${NC}"

if [ $FAILED_TESTS -eq 0 ]; then
    echo -e "\n${GREEN}✓ 所有測試通過！${NC}"
    exit 0
else
    echo -e "\n${RED}✗ 有測試失敗，請檢查！${NC}"
    exit 1
fi
