# cycle_models.py

from abc import ABC, abstractmethod
from typing import Dict, Any, List

class CycleModel(ABC):
    """
    周期模型抽象基类 (Abstract Base Class)。

    定义了所有市场周期、板块轮动或生命周期模型的统一接口。
    确保上层应用（如FSM）可以调用周期分析功能，而无需关心其具体实现
    （例如，是十二长生、二十四节气还是美林投资时钟）。
    """

    @abstractmethod
    def get_current_stage(self, data: Dict[str, Any]) -> str:
        """
        根据输入数据，判断当前处于哪个周期阶段。
        :param data: 包含用于分析的数据的字典 (e.g., economic indicators, price momentum).
        :return: 当前周期阶段的名称。
        """
        pass

    @abstractmethod
    def get_stage_characteristics(self, stage: str) -> Dict[str, Any]:
        """
        获取特定阶段的特征描述或建议策略。
        :param stage: 阶段名称。
        :return: 包含该阶段特征描述的字典。
        """
        pass

    @abstractmethod
    def get_all_stages(self) -> List[str]:
        """
        返回模型中所有阶段的有序列表。
        :return: 包含所有阶段名称的列表。
        """
        pass


class TwelveStagesOfLifeCycleModel(CycleModel):
    """
    十二长生周期模型的具体实现。

    该模型将事物的生命周期分为十二个阶段，用于描述板块轮动或个股的生命周期。
    """

    def __init__(self):
        self._stages = [
            "长生", "沐浴", "冠带", "临官", "帝旺",
            "衰", "病", "死", "墓", "绝", "胎", "养"
        ]
        self._characteristics = {
            "长生": {"description": "新生，事物初生，潜力巨大。", "strategy": "关注，少量试探"},
            "沐浴": {"description": "萌芽，成长初期，易受挫折。", "strategy": "谨慎观察，识别风险"},
            "冠带": {"description": "成型，初步获得社会承认。", "strategy": "逐步建仓"},
            "临官": {"description": "高速增长，事业有成。", "strategy": "持有并加仓"},
            "帝旺": {"description": "顶峰，达到全盛时期。", "strategy": "警惕风险，考虑减仓"},
            "衰":   {"description": "衰退，开始走下坡路。", "strategy": "逐步卖出"},
            "病":   {"description": "问题暴露，盈利能力减弱。", "strategy": "清仓"},
            "死":   {"description": "明显下滑，失去活力。", "strategy": "避免接触"},
            "墓":   {"description": "估值塌陷，被市场遗忘。", "strategy": "观望，等待转机"},
            "绝":   {"description": "市场失忆，完全被忽视。", "strategy": "观望"},
            "胎":   {"description": "潜伏，新一轮周期的孕育。", "strategy": "研究，寻找新催化剂"},
            "养":   {"description": "建仓期，主力资金开始布局。", "strategy": "少量布局，等待信号"}
        }

    def get_current_stage(self, data: Dict[str, Any]) -> str:
        """
        模拟根据市场数据判断当前所处的“十二长生”阶段。
        在真实实现中，这里会是一个复杂的量化模型。
        """
        # 模拟逻辑：简单地根据一个随机分数来确定阶段
        # score 范围 0-11
        mock_score = data.get("mock_score", 0)
        stage_index = int(mock_score) % len(self._stages)
        return self._stages[stage_index]

    def get_stage_characteristics(self, stage: str) -> Dict[str, Any]:
        """
        获取指定“十二长生”阶段的特征和策略建议。
        """
        return self._characteristics.get(stage, {"description": "未知阶段", "strategy": "无"})

    def get_all_stages(self) -> List[str]:
        """
        返回所有十二长生阶段。
        """
        return self._stages

# --- 示例：如何使用解耦的周期模型 ---
if __name__ == '__main__':
    import random

    # 上层应用（如FSM）依赖于抽象的 CycleModel
    def analyze_market_cycle(model: CycleModel, market_data: Dict[str, Any]):
        current_stage = model.get_current_stage(market_data)
        characteristics = model.get_stage_characteristics(current_stage)
        
        print(f"当前市场周期分析 (模型: {model.__class__.__name__}):")
        print(f"  - 所处阶段: 【{current_stage}】")
        print(f"  - 阶段描述: {characteristics['description']}")
        print(f"  - 建议策略: {characteristics['strategy']}")

    # 运行时，传入一个具体的周期模型实例
    twelve_stages_model = TwelveStagesOfLifeCycleModel()

    # 模拟不同的市场数据
    for i in range(3):
        # 在真实场景中，这里会是真实的经济或市场数据
        simulated_market_data = {"mock_score": random.randint(0, 11)}
        analyze_market_cycle(twelve_stages_model, simulated_market_data)
        print("-" * 50)

    # 如果未来要添加“美林投资时钟”模型，只需实现一个新的类，
    # 上层应用 analyze_market_cycle 的代码完全不需要修改。
    # class MerrillClockModel(CycleModel):
    #     ...
    # merrill_model = MerrillClockModel()
    # analyze_market_cycle(merrill_model, real_economic_data)
