"""数据规格和执行计划定义。

定义因子计算所需的数据规格和执行计划结构。
"""

from dataclasses import dataclass, field
from typing import Any, Dict, List, Literal, Optional, Set, Union

import polars as pl


@dataclass
class DataSpec:
    """数据规格定义（支持多表类型）。

    描述因子计算所需的数据表和字段，支持多种拼接类型。

    Attributes:
        table: 数据表名称
        columns: 需要的字段列表
        join_type: 拼接类型
            - "standard": 标准等值匹配（默认）
            - "asof_backward": 向后寻找最近历史数据（财务数据用）
        left_on: 左表 join 键（asof 模式下必须指定）
        right_on: 右表 join 键（asof 模式下必须指定）
    """

    table: str
    columns: List[str]
    join_type: Literal["standard", "asof_backward"] = "standard"
    left_on: Optional[str] = None  # 行情表日期列名
    right_on: Optional[str] = None  # 财务表日期列名

    def __post_init__(self):
        """验证 asof_backward 模式的参数。"""
        if self.join_type == "asof_backward":
            if not self.left_on or not self.right_on:
                raise ValueError("asof_backward 模式必须指定 left_on 和 right_on")


@dataclass
class ExecutionPlan:
    """执行计划。

    包含完整的执行所需信息：数据源、转换逻辑、输出格式。

    Attributes:
        data_specs: 数据规格列表
        polars_expr: Polars 表达式
        dependencies: 依赖的原始字段
        output_name: 输出因子名称
        factor_dependencies: 依赖的其他因子名称（用于分步执行）
    """

    data_specs: List[DataSpec]
    polars_expr: pl.Expr
    dependencies: Set[str]
    output_name: str
    factor_dependencies: Set[str] = field(default_factory=set)
