from typing import NotRequired, TypedDict

from ldnode.calculator.schemas.enumerations import (
    BenchmarkType,
    RebalanceType,
    RotationType,
    StopType,
)

from .screen import (
    CBScreenParameters,
    ETFScreenParameters,
    ScreenParameters,
    STKScreenParameters,
)


class DataRange(TypedDict):
    """日期范围"""

    start_date: str  # 开始日期
    end_date: str  # 结束日期


class StopMethod(TypedDict):
    """止盈/止损方式"""

    stop_type: StopType  # 止盈/止损类型
    stop_value: float  # 止盈/止损值


class RebalanceMethod(TypedDict):
    """调仓方式"""

    rebalance_type: RebalanceType  # 调仓类型
    rebalance_value: int  # 调仓参数


class BacktestStorageKeys(TypedDict, total=False):
    """回测结果 COS 存储路径（由调用方预生成，不传则使用默认规则）
    建议格式: backtest/{backtest_id}/result.parquet
    """

    result_key: str      # timeline Parquet 路径
    evalution_key: str   # 评估指标 JSON 路径
    position_key: str    # 历史持仓 Parquet 路径


class BacktestParameters(ScreenParameters):
    """事件回测参数"""

    capital: float  # 资金
    commission: float  # 手续费(单边)
    date_range: DataRange  # 回测时间范围
    benchmark: BenchmarkType  # 基准

    rebalance_method: RebalanceMethod  # 调仓方式
    stop_method: StopMethod  # 止盈/止损方式
    rotation_type: RotationType  # 换仓类型
    storage_keys: NotRequired[BacktestStorageKeys]  # 预生成的 COS 路径（可选）


class CBBacktestParameters(BacktestParameters, CBScreenParameters):
    """可转债事件回测参数"""


class STKBacktestParameters(BacktestParameters, STKScreenParameters):
    """股票事件回测参数"""


class ETFBacktestParameters(BacktestParameters, ETFScreenParameters):
    """基金事件回测参数"""


class EvaluateData(TypedDict):
    """回测评价数据"""

    cum_asset: float  # 累计资产
    total_return: float  # 总收益率
    trading_days: int  # 交易天数
    annu_return: float  # 年化收益率
    daily_turnover: float | None  # 日均换手率
    profit_count: int  # 盈利天数
    daily_win_rate: float  # 日胜率
    daily_profit_mean: float  # 平均日盈利
    daily_loss_mean: float  # 平均日亏损
    daily_profit_loss_rate: float  # 日盈亏比
    daily_pnl_mean: float  # 日均收益
    daily_pnl_std: float  # 日均收益标准差
    daily_loss_std: float  # 日均下行收益标准差
    daily_max_profit: float  # 最大日收益
    daily_max_loss: float  # 最大日亏损
    daily_max_drawdown: float  # 最大日回撤
    daily_max_drawdown_duration_trade_days: int  # 最大回撤持续交易日
    daily_max_drawdown_duration_calendar_days: int  # 最大回撤持续日历日
    sharpe_ratio: float  # 夏普比率
    calmar_ratio: float  # 卡玛比比率
    sortino_ratio: float  # 索提诺比率


class EvaluateDataWithTest(EvaluateData):
    """回测评价数据(携带测试集)"""

    test: NotRequired[EvaluateData]


class GlanceEvaluateData(TypedDict):
    """收益概览评价数据（数值字段为 None 表示该指标无法计算，前端显示为 "-"）"""

    start_date: str  # 开始日期
    end_date: str  # 结束日期
    created_date: str  # 创建日期
    annu_return: float | None  # 年化收益率
    daily_max_drawdown: float | None  # 最大日回撤
    sharpe_ratio: float | None  # 夏普比率
    last_1_return: float | None  # 近1个交易日收益率
    last_5_return: float | None  # 近5个交易日收益率
    last_20_return: float | None  # 近20个交易日收益率
    last_60_return: float | None  # 近60个交易日收益率
    last_242_return: float | None  # 近242个交易日收益率
    this_month_return: float | None  # 本月收益率
    this_year_return: float | None  # 本年收益率
    created_return: float | None  # 创建以来收益率
    total_return: float | None  # 总收益率
