#!/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 list_models(
    station_name: Optional[str] = None,
    sort_by: str = "training_date",
    limit: Optional[int] = None
) -> Optional[Dict[str, Any]]:
    """
    查询所有可用模型及其性能指标
    
    参数:
    station_name: 按站点名称过滤（可选）
    sort_by: 排序字段 (r2, rmse, mae, mape, training_date)，默认: training_date
    limit: 限制返回结果数量（可选）
    
    返回:
    接口返回的JSON响应
    """
    # API 端点 - 预留位置，等待后续接口开发
    url = "http://47.96.16.84:5001/api/unified/models/list"
    
    # 构建查询参数
    params = {
        "sort_by": sort_by
    }
    
    if station_name:
        params["station_name"] = station_name
    
    if limit:
        params["limit"] = limit
    
    headers = {
        "Content-Type": "application/json"
    }
    
    try:
        print(f"正在查询模型列表...")
        print(f"API 端点: {url}")
        print(f"查询参数: {params}")
        print()
        
        response = requests.get(url, params=params, headers=headers, timeout=30)
        response.raise_for_status()
        result = response.json()
        
        if result.get("success"):
            print("✓ 模型列表查询成功！")
            print()
            
            # 格式化输出
            models = result.get("data", {}).get("models", [])
            total_count = result.get("data", {}).get("total_count", 0)
            
            print(f"总模型数: {total_count}")
            if station_name:
                print(f"站点过滤: {station_name}")
            print(f"排序方式: {sort_by}")
            if limit:
                print(f"显示数量: {limit}")
            print()
            
            if models:
                print("=" * 120)
                print(f"{'模型ID':<35} {'站点':<10} {'训练日期':<20} {'R²':<8} {'RMSE':<10} {'MAE':<10} {'MAPE':<8}")
                print("=" * 120)
                
                for model in models:
                    model_id = model.get("model_id", "N/A")[:34]
                    station = model.get("station_name", "N/A")
                    train_date = model.get("training_date", "N/A")
                    metrics = model.get("performance_metrics", {})
                    r2 = metrics.get("r2", 0)
                    rmse = metrics.get("rmse", 0)
                    mae = metrics.get("mae", 0)
                    mape = metrics.get("mape", 0)
                    
                    print(f"{model_id:<35} {station:<10} {train_date:<20} {r2:<8.4f} {rmse:<10.2f} {mae:<10.2f} {mape:<8.2f}")
                
                print("=" * 120)
                print()
                
                # 输出详细的 JSON 格式
                print("详细信息 (JSON 格式):")
                print(json.dumps(result, indent=2, ensure_ascii=False))
            else:
                print("未找到匹配的模型")
            
            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('--station_name', type=str, default=None, help='按站点名称过滤')
    parser.add_argument('--sort_by', type=str, default='training_date', 
                        choices=['r2', 'rmse', 'mae', 'mape', 'training_date'],
                        help='排序字段，默认: training_date')
    parser.add_argument('--limit', type=int, default=None, help='限制返回结果数量')
    
    args = parser.parse_args()
    
    result = list_models(
        station_name=args.station_name,
        sort_by=args.sort_by,
        limit=args.limit
    )
    
    if result is None:
        exit(1)
