import json
import requests
from typing import Dict, Any
import os


def load_json_file(file_path: str) -> Dict[str, Any]:
    """从JSON文件加载数据"""
    if not os.path.exists(file_path):
        raise FileNotFoundError(f"文件不存在: {file_path}")

    with open(file_path, 'r', encoding='utf-8') as f:
        try:
            return json.load(f)
        except json.JSONDecodeError as e:
            raise ValueError(f"JSON解析错误: {str(e)}")


def send_to_server(api_url: str, payload: Dict[str, Any]) -> None:
    """发送数据到服务器并处理响应"""
    headers = {'Content-Type': 'application/json'}

    try:
        response = requests.post(
            api_url,
            json=payload,
            headers=headers,
            timeout=10
        )

        # 解析响应
        resp_data = response.json()
        print("\n服务器响应:")
        print(f"状态码: {response.status_code}")
        print(f"响应内容: {resp_data}")

        # 检查响应格式
        if not isinstance(resp_data, dict) or 'status' not in resp_data or 'msg' not in resp_data:
            print("警告: 服务器返回了非标准响应格式")

        if response.status_code == 200 and resp_data.get('status') == 200:
            print("请求处理成功!")
        else:
            print("请求处理失败!")

    except requests.exceptions.RequestException as e:
        print(f"\n请求失败: {str(e)}")
        if hasattr(e, 'response') and e.response is not None:
            print(f"错误响应: {e.response.text}")


def main():
    # 配置参数
    config = {
        "server_url": "http://127.0.0.1:8081/process_brdf/",
        "json_file": "test_data.json"
    }

    print("=== BRDF 测试客户端 ===")
    print(f"服务器地址: {config['server_url']}")
    print(f"测试数据文件: {config['json_file']}")

    try:
        # 1. 加载测试数据
        print("\n正在加载测试数据...")
        payload = load_json_file(config['json_file'])
        print("测试数据加载成功!")
        print(json.dumps(payload, indent=2, ensure_ascii=False))

        # 2. 发送到服务器
        print("\n正在发送数据到服务器...")
        send_to_server(config['server_url'], payload)

    except Exception as e:
        print(f"\n发生错误: {str(e)}")


if __name__ == "__main__":
    main()