#!/usr/bin/env python3
import argparse
import requests
import json
import os
import subprocess
from datetime import datetime

API_BASE_URL = "http://47.96.16.84:5006"

# 正确的路径计算
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
SKILL_DIR = os.path.dirname(SCRIPT_DIR)
# 计算report-generator的路径
REPORT_GENERATOR_DIR = os.path.join(os.path.dirname(SKILL_DIR), "report-generator")

def generate_report(comparison_data, target_date, station_id):
    """
    生成对比报告
    """
    # 准备报告数据
    report_data = []
    for item in comparison_data:
        report_data.append({
            "time": item['time'],
            "actual": item['actual'],
            "predicted": item['predicted'],
            "difference": item['difference']
        })
    
    # 调用step1_select.py选择模板
    step1_script = os.path.join(REPORT_GENERATOR_DIR, "scripts", "step1_select.py")
    if not os.path.exists(step1_script):
        raise Exception(f"Step1 script not found at {step1_script}")
    
    user_query = f"对比{target_date}站点{station_id}的历史数据和预测数据"
    step1_cmd = ["python", step1_script, "--query", user_query, "--data", json.dumps(report_data, ensure_ascii=False)]
    step1_result = subprocess.run(step1_cmd, capture_output=True, text=True, timeout=60)
    
    if step1_result.returncode != 0:
        raise Exception(f"Step 1 failed: {step1_result.stderr}")
    
    lines = step1_result.stdout.strip().split('\n')
    step1_output = None
    for line in reversed(lines):
        try:
            step1_output = json.loads(line)
            break
        except:
            continue
    
    if step1_output is None or step1_output.get("status") != "success":
        raise Exception(f"Template selection failed")
    
    template_name = step1_output.get("template_name", "lineChartCompare")
    
    # 调用step2_render.py生成报告
    step2_script = os.path.join(REPORT_GENERATOR_DIR, "scripts", "step2_render.py")
    if not os.path.exists(step2_script):
        raise Exception(f"Step2 script not found at {step2_script}")
    
    step2_cmd = ["python", step2_script, "--query", user_query, "--template", template_name, "--data", json.dumps(report_data, ensure_ascii=False)]
    step2_result = subprocess.run(step2_cmd, capture_output=True, text=True, timeout=60)
    
    if step2_result.returncode != 0:
        raise Exception(f"Step 2 failed: {step2_result.stderr}")
    
    lines = step2_result.stdout.strip().split('\n')
    step2_output = None
    for line in reversed(lines):
        try:
            step2_output = json.loads(line)
            break
        except:
            continue
    
    if step2_output is None or step2_output.get("status") != "success":
        raise Exception(f"Report generation failed")
    
    report_address = step2_output.get('address', '')
    summary = step2_output.get('summary', '')
    
    print("\nGENERATING REPORT")
    print("=" * 60)
    print("PROGRESSION: ⏳ 正在分析数据，选择合适的可视化模板...")
    print(f"Selected template: {template_name}")
    print("PROGRESSION: ⏳ 正在将数据渲染为图表报告...")
    print("")
    print("✓ Report generated successfully!")
    
    print(f"Summary: {summary}")
    print("")
    print(f"@@@@@{report_address}@@@@@")
    print("")
    print("#####%查看详细数据%￥点击上方链接查看完整的数据分析报告￥ %继续深入分析%￥基于当前数据进行更深度的挖掘￥ %导出报告%￥将当前报告导出为PDF或图片格式￥#####")
    
    return report_address


def compare_prediction(target_date, station_id):
    """
    对比指定日期的历史数据和预测数据
    
    参数:
    target_date: 目标日期，格式: "2024-07-01"
    station_id: 站点ID，必填
    
    返回:
    对比结果
    """

    # 构建目标时间字符串
    target_time = f"{target_date} 00:00:00"
    
    # 调用快速预测接口
    url = f"{API_BASE_URL}/api/prediction/quick"
    payload = {"target_time": target_time, "prediction_steps": 96}
    
    try:
        response = requests.post(url, json=payload, timeout=60)
        response.raise_for_status()
        predict_data = response.json()
        
        if not predict_data or not predict_data.get("success"):
            print("获取预测数据失败")
            return None
        
        stations_data = predict_data.get("stations", {})
        
        if station_id not in stations_data:
            print(f"站点 {station_id} 不存在或无数据")
            return None
            
        station_pred = stations_data[station_id]
        predicteds = station_pred.get("predicted", [])
        actuals = station_pred.get("actual", [])
        
        if not predicteds or not actuals:
            print("无预测数据或历史数据")
            return None
            
        # 生成时间序列
        time_points = []
        for i in range(96):
            hour = i // 4
            minute = (i % 4) * 15
            time_points.append(f"{hour:02d}:{minute:02d}")
        
        # 构建对比数据
        comparison_data = []
        for time_point, actual, predicted in zip(time_points, actuals, predicteds):
            comparison_data.append({
                "time": time_point,
                "actual": actual,
                "predicted": predicted,
                "difference": predicted - actual if actual is not None else None
            })
        
        return {station_id: comparison_data}
        
    except Exception as e:
        print(f"对比数据获取失败: {e}")
        return None

def main():
    parser = argparse.ArgumentParser(description='对比历史数据和预测数据')
    parser.add_argument('--target_date', type=str, required=True, help='目标日期，格式: "2024-07-01"')
    parser.add_argument('--station_id', type=str, required=True, help='站点ID，必填')
    args = parser.parse_args()
    
    results = compare_prediction(args.target_date, args.station_id)
    
    if results:
        print("对比结果:")
        for station, data in results.items():
            print(f"\n站点: {station}")
            print("时间\t\t实际值(kW)\t预测值(kW)\t差值(kW)")
            print("-" * 60)
            for item in data:
                actual = item['actual'] if item['actual'] is not None else "N/A"
                predicted = item['predicted'] if item['predicted'] is not None else "N/A"
                difference = item['difference'] if item['difference'] is not None else "N/A"
                print(f"{item['time']}\t\t{actual}\t\t{predicted}\t\t{difference}")
            
            # 生成报告
            try:
                generate_report(data, args.target_date, station)
            except Exception as e:
                print(f"报告生成失败: {e}")

if __name__ == "__main__":
    main()