from typing import TypedDict, Any, TypeVar, Generic

from ldnode.calculator.schemas.enumerations import FactorType, ExprType, RankScope, ProcessMissingDataMethod, NeutralizationMethod


NFT = TypeVar("NFT", bound=NeutralizationMethod)
""" 中性化因子类型 """
MMT = TypeVar("MMT", bound=ProcessMissingDataMethod)
""" 缺失值处理方式类型 """


class ExcludeFactor(TypedDict):
    """ 排除因子 """
    factor: str # 因子
    type: FactorType # 因子类型
    operator: str # 操作符
    value: Any # 值
    

class ComputedFactor(TypedDict):
    """ 自定义因子 """
    factor: str # 因子
    expr: str # 表达式
    expr_type: ExprType # 表达式类型
    is_intermediate: bool # 是否是中间过程


class RankFactor(TypedDict, Generic[NFT, MMT]):
    """ 打分因子配置 """
    factor: str # 因子名
    type: FactorType # 因子类型
    ascending: bool # 是否升序
    weight: float # 权重
    scope: RankScope # 行业级别
    neutralization_factor: list[NFT | ComputedFactor] # 中性化因子
    process_missing_data_method: MMT # 缺失值处理方式
