"""进销存插件生命周期。

接管开关不使用 plugin_configs.is_active（二值，停用即回落旧逻辑，
会导致 stock_qty 被订单重新直接改写，冻结无法成立）。
"""
from enum import Enum

from fastapi import HTTPException


class LifecycleState(str, Enum):
    ACTIVE = "active"        # 正常启用：流水权威，投影由插件维护
    ARREARS = "arrears"      # 欠费未停服：仍接管且允许下单，只做账务标记
    SUSPENDED = "suspended"  # 主动停用：账本只读，拒绝一切库存写入
    RETIRED = "retired"      # 放弃进销存：显式解除接管后方可回落旧逻辑


class InventorySuspended(HTTPException):
    def __init__(self) -> None:
        super().__init__(status_code=503, detail="进销存已暂停，库存操作不可用")


def takeover_active(state: LifecycleState | None) -> bool:
    """该租户的库存读写是否由账本接管。retired 与无记录不接管。"""
    return state in (LifecycleState.ACTIVE, LifecycleState.ARREARS, LifecycleState.SUSPENDED)


def assert_writable(state: LifecycleState | None) -> None:
    """仅 suspended（主动停用）拒写；欠费不中断经营。未接管租户不受此守卫影响。"""
    if state == LifecycleState.SUSPENDED:
        raise InventorySuspended()
