"""
资产状态机服务
定义资产状态的转换规则和验证
"""
from typing import Dict, List, Optional
from enum import Enum


class AssetStatus(str, Enum):
    """资产状态枚举"""
    PENDING = "pending"                # 待入库
    IN_STOCK = "in_stock"              # 库存中
    IN_USE = "in_use"                  # 使用中
    TRANSFERRING = "transferring"      # 调拨中
    MAINTENANCE = "maintenance"        # 维修中
    PENDING_SCRAP = "pending_scrap"    # 待报废
    SCRAPPED = "scrapped"              # 已报废
    LOST = "lost"                      # 已丢失


class StateMachineService:
    """状态机服务类"""

    # 状态转换规则
    TRANSITIONS: Dict[str, List[str]] = {
        AssetStatus.PENDING: [
            AssetStatus.IN_STOCK,
            AssetStatus.PENDING_SCRAP,
        ],
        AssetStatus.IN_STOCK: [
            AssetStatus.IN_USE,
            AssetStatus.TRANSFERRING,
            AssetStatus.MAINTENANCE,
            AssetStatus.PENDING_SCRAP,
            AssetStatus.LOST,
        ],
        AssetStatus.IN_USE: [
            AssetStatus.IN_STOCK,
            AssetStatus.TRANSFERRING,
            AssetStatus.MAINTENANCE,
            AssetStatus.PENDING_SCRAP,
            AssetStatus.LOST,
        ],
        AssetStatus.TRANSFERRING: [
            AssetStatus.IN_STOCK,
            AssetStatus.IN_USE,
        ],
        AssetStatus.MAINTENANCE: [
            AssetStatus.IN_STOCK,
            AssetStatus.IN_USE,
            AssetStatus.PENDING_SCRAP,
        ],
        AssetStatus.PENDING_SCRAP: [
            AssetStatus.SCRAPPED,
            AssetStatus.IN_STOCK,  # 取消报废
        ],
        AssetStatus.SCRAPPED: [],  # 终态，不可转换
        AssetStatus.LOST: [],      # 终态，不可转换
    }

    # 状态显示名称
    STATUS_NAMES: Dict[str, str] = {
        AssetStatus.PENDING: "待入库",
        AssetStatus.IN_STOCK: "库存中",
        AssetStatus.IN_USE: "使用中",
        AssetStatus.TRANSFERRING: "调拨中",
        AssetStatus.MAINTENANCE: "维修中",
        AssetStatus.PENDING_SCRAP: "待报废",
        AssetStatus.SCRAPPED: "已报废",
        AssetStatus.LOST: "已丢失",
    }

    def can_transition(self, current_status: str, target_status: str) -> bool:
        """
        检查状态是否可以转换

        Args:
            current_status: 当前状态
            target_status: 目标状态

        Returns:
            是否可以转换
        """
        allowed_transitions = self.TRANSITIONS.get(current_status, [])
        return target_status in allowed_transitions

    def validate_transition(
        self,
        current_status: str,
        target_status: str
    ) -> Optional[str]:
        """
        验证状态转换并返回错误信息

        Args:
            current_status: 当前状态
            target_status: 目标状态

        Returns:
            错误信息，如果转换有效则返回None
        """
        if current_status == target_status:
            return "当前状态与目标状态相同"

        if current_status not in self.TRANSITIONS:
            return f"无效的当前状态: {current_status}"

        if target_status not in self.TRANSITIONS:
            return f"无效的目标状态: {target_status}"

        if not self.can_transition(current_status, target_status):
            return f"无法从状态 '{self.get_status_name(current_status)}' 转换到 '{self.get_status_name(target_status)}'"

        return None

    def get_status_name(self, status: str) -> str:
        """
        获取状态的显示名称

        Args:
            status: 状态值

        Returns:
            状态显示名称
        """
        return self.STATUS_NAMES.get(status, status)

    def get_allowed_transitions(self, current_status: str) -> List[str]:
        """
        获取允许的转换状态列表

        Args:
            current_status: 当前状态

        Returns:
            允许转换到的状态列表
        """
        return self.TRANSITIONS.get(current_status, [])

    def is_terminal_state(self, status: str) -> bool:
        """
        判断是否为终态

        Args:
            status: 状态值

        Returns:
            是否为终态
        """
        return len(self.TRANSITIONS.get(status, [])) == 0

    def get_available_statuses(self) -> List[Dict[str, str]]:
        """
        获取所有可用状态列表

        Returns:
            状态列表，每个状态包含value和name
        """
        return [
            {"value": status, "name": name}
            for status, name in self.STATUS_NAMES.items()
        ]


# 创建全局实例
state_machine_service = StateMachineService()
