# src/analysis/result_analyzer.py

import pandas as pd
import numpy as np
from typing import List, Dict, Any, Optional

# 导入纯函数 (注意相对导入路径的变化)
from .analysis_utils import (
    calculate_metrics,
    plot_equity_and_drawdown_chart,
    plot_close_price_chart,
)

# 导入核心数据类 (注意相对导入路径的变化)
from ..core_data import PortfolioSnapshot, Trade, Bar


class ResultAnalyzer:
    """
    结果分析器：负责接收回测数据，并提供分析和可视化方法。
    """

    def __init__(
        self,
        portfolio_snapshots: List[PortfolioSnapshot],
        trade_history: List[Trade],
        bars: List[Bar],
        initial_capital: float,
    ):
        """
        Args:
            portfolio_snapshots (List[PortfolioSnapshot]): 回测引擎输出的投资组合快照列表。
            trade_history (List[Trade]): 回测引擎输出的交易历史记录列表。
            bars (List[Bar]): 回测引擎输出的所有K线数据列表 (可能包含多个合约的K线)。
            initial_capital (float): 初始资金。
        """
        self.portfolio_snapshots = portfolio_snapshots
        self.trade_history = trade_history
        self.initial_capital = initial_capital
        self.bars = bars # 接收所有K线数据
        self._metrics_cache: Optional[Dict[str, Any]] = None

        print("\n--- 结果分析器初始化完成 ---")

    def calculate_all_metrics(self) -> Dict[str, Any]:
        """
        计算所有关键绩效指标。
        如果已计算过则返回缓存结果，否则调用纯函数计算。
        """
        if self._metrics_cache is None:
            print("正在计算绩效指标...")
            self._metrics_cache = calculate_metrics(
                self.portfolio_snapshots, self.trade_history, self.initial_capital
            )
            print("绩效指标计算完成。")
        return self._metrics_cache

    def generate_report(self) -> None:
        """
        生成并打印详细的回测报告。
        """
        if self.trade_history:
            print("\n--- 交易明细 ---")
            for trade in self.trade_history:
                # 调整输出格式，显示实现盈亏
                pnl_display = f" | PnL: {trade.realized_pnl:.2f}" if trade.is_close_trade else ""
                print(
                    f"  {trade.fill_time} | {trade.direction:<10} | {trade.symbol} | Vol: {trade.volume} | Price: {trade.price:.2f} | Comm: {trade.commission:.2f}{pnl_display}"
                )
        else:
            print("\n没有交易记录。")


        metrics = self.calculate_all_metrics()

        print("\n--- 回测绩效报告 ---")
        print(f"{'初始资金':<15}: {metrics['初始资金']:.2f}")
        print(f"{'最终资金':<15}: {metrics['最终资金']:.2f}")
        print(f"{'总收益率':<15}: {metrics['总收益率']:.2%}")
        print(f"{'年化收益率':<15}: {metrics['年化收益率']:.2%}")
        print(f"{'最大回撤':<15}: {metrics['最大回撤']:.2%}")
        print(f"{'夏普比率':<15}: {metrics['夏普比率']:.2f}")
        print(f"{'卡玛比率':<15}: {metrics['卡玛比率']:.2f}")
        print(f"{'总交易次数':<15}: {metrics['总交易次数']}")
        print(f"{'总实现盈亏':<15}: {metrics['总实现盈亏']:.2f}") # 新增
        print(f"{'交易成本':<15}: {metrics['交易成本']:.2f}")

        # 新增交易相关详细指标，以适应更全面的交易分析需求
        print("\n--- 交易详情 ---")
        print(f"{'盈利交易次数':<15}: {metrics['盈利交易次数']}")
        print(f"{'亏损交易次数':<15}: {metrics['亏损交易次数']}")
        print(f"{'胜率':<15}: {metrics['胜率']:.2%}")
        print(f"{'盈亏比':<15}: {metrics['盈亏比']:.2f}")
        print(f"{'平均每次盈利':<15}: {metrics['平均每次盈利']:.2f}")
        print(f"{'平均每次亏损':<15}: {metrics['平均每次亏损']:.2f}")


    def plot_performance(self) -> None:
        """
        绘制投资组合净值和回撤曲线，以及所有合约的收盘价曲线。
        """
        print("正在绘制绩效图表...")
        plot_equity_and_drawdown_chart(
            self.portfolio_snapshots,
            self.initial_capital,
            title="Portfolio Equity and Drawdown Curve (All Contracts)" # 明确标题，表明是整体曲线
        )

        # 绘制所有处理过的K线收盘价曲线
        plot_close_price_chart(self.bars, title="Underlying Asset Close Price (Concatenated Bars)") # 明确标题
        print("图表绘制完成。")