#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
模型详细信息查询脚本
调用统一API的模型详情接口
"""
import requests
import json
from datetime import datetime
import argparse
from typing import Optional, Dict, Any

def get_model_details(
    model_id: str,
    model_path: Optional[str] = None
) -> Optional[Dict[str, Any]]:
    """
    获取指定模型的详细信息
    
    参数:
    model_id: 模型标识符或文件名
    model_path: 模型文件的完整路径（可选）
    
    返回:
    接口返回的JSON响应
    """
    # API 端点 - 预留位置，等待后续接口开发
    url = "http://47.96.16.84:5001/api/unified/models/details"
    
    # 构建查询参数
    params = {
        "model_id": model_id
    }
    
    if model_path:
        params["model_path"] = model_path
    
    headers = {
        "Content-Type": "application/json"
    }
    
    try:
        print(f"正在查询模型详细信息...")
        print(f"API 端点: {url}")
        print(f"模型ID: {model_id}")
        if model_path:
            print(f"模型路径: {model_path}")
        print()
        
        response = requests.get(url, params=params, headers=headers, timeout=30)
        response.raise_for_status()
        result = response.json()
        
        if result.get("success"):
            print("✓ 模型详细信息查询成功！")
            print()
            
            data = result.get("data", {})
            
            # 基本信息
            print("=" * 80)
            print("基本信息")
            print("=" * 80)
            print(f"模型ID:        {data.get('model_id', 'N/A')}")
            print(f"文件名:        {data.get('filename', 'N/A')}")
            print(f"站点名称:      {data.get('station_name', 'N/A')}")
            print(f"训练日期:      {data.get('training_date', 'N/A')}")
            print(f"模型大小:      {data.get('model_size_mb', 'N/A')} MB")
            print(f"参数数量:      {data.get('parameter_count', 'N/A')}")
            print()
            
            # 数据范围
            data_range = data.get("data_range", {})
            print("=" * 80)
            print("训练数据范围")
            print("=" * 80)
            print(f"开始时间:      {data_range.get('start', 'N/A')}")
            print(f"结束时间:      {data_range.get('end', 'N/A')}")
            print()
            
            # 模型架构
            architecture = data.get("model_architecture", {})
            print("=" * 80)
            print("模型架构")
            print("=" * 80)
            print(f"模型类型:      {architecture.get('type', 'N/A')}")
            print(f"站点数量:      {architecture.get('n_stations', 'N/A')}")
            print(f"特征数量:      {architecture.get('n_features', 'N/A')}")
            print(f"模型维度:      {architecture.get('d_model', 'N/A')}")
            print(f"层数:          {architecture.get('num_layers', 'N/A')}")
            print(f"序列长度:      {architecture.get('seq_len', 'N/A')}")
            print(f"预测长度:      {architecture.get('pred_len', 'N/A')}")
            print(f"Dropout:       {architecture.get('dropout', 'N/A')}")
            print()
            
            # 性能指标
            metrics = data.get("performance_metrics", {})
            print("=" * 80)
            print("性能指标")
            print("=" * 80)
            print(f"R² (决定系数):        {metrics.get('r2', 'N/A'):.6f}")
            print(f"RMSE (均方根误差):    {metrics.get('rmse', 'N/A'):.2f}")
            print(f"MAE (平均绝对误差):   {metrics.get('mae', 'N/A'):.2f}")
            print(f"MAPE (平均绝对百分比误差): {metrics.get('mape', 'N/A'):.2f}%")
            if 'daytime_mape' in metrics:
                print(f"白天MAPE:             {metrics.get('daytime_mape', 'N/A'):.2f}%")
            print()
            
            # 训练信息
            training_info = data.get("training_info", {})
            print("=" * 80)
            print("训练信息")
            print("=" * 80)
            print(f"总轮数:        {training_info.get('total_epochs', 'N/A')}")
            print(f"最佳轮数:      {training_info.get('best_epoch', 'N/A')}")
            print(f"训练时长:      {training_info.get('training_duration_seconds', 'N/A')} 秒")
            print(f"批大小:        {training_info.get('batch_size', 'N/A')}")
            print(f"学习率:        {training_info.get('learning_rate', 'N/A')}")
            print(f"优化器:        {training_info.get('optimizer', 'N/A')}")
            print()
            
            # 输出完整的 JSON 格式
            print("=" * 80)
            print("完整信息 (JSON 格式)")
            print("=" * 80)
            print(json.dumps(result, indent=2, ensure_ascii=False))
            
            return result
        else:
            print(f"✗ 模型详细信息查询失败: {result.get('message', '未知错误')}")
            print(f"返回内容: {json.dumps(result, indent=2, ensure_ascii=False)}")
            return None
            
    except requests.exceptions.Timeout:
        print(f"✗ 请求超时（30秒）")
        return None
    except requests.exceptions.ConnectionError:
        print(f"✗ 无法连接到 API 服务器: {url}")
        print(f"请确保服务器地址正确且服务正在运行")
        return None
    except requests.exceptions.HTTPError as e:
        print(f"✗ HTTP 错误: {e}")
        print(f"状态码: {response.status_code}")
        print(f"响应内容: {response.text}")
        return None
    except Exception as e:
        print(f"✗ 模型详细信息查询失败: {e}")
        import traceback
        traceback.print_exc()
        return None

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='模型详细信息查询脚本')
    parser.add_argument('--model_id', type=str, required=True, help='模型标识符或文件名')
    parser.add_argument('--model_path', type=str, default=None, help='模型文件的完整路径（可选）')
    
    args = parser.parse_args()
    
    result = get_model_details(
        model_id=args.model_id,
        model_path=args.model_path
    )
    
    if result is None:
        exit(1)
