"""统一错误码与领域异常（ARCH §7.1）。"""

from __future__ import annotations

from enum import StrEnum


class ErrorCode(StrEnum):
    NOT_FOUND = "NOT_FOUND"
    VALIDATION = "VALIDATION"
    CONFLICT = "CONFLICT"  # 资源状态冲突（如对非 awaiting 链 job 续跑）
    CONFLICT_UNRESOLVED = "CONFLICT_UNRESOLVED"  # 未决冲突禁验收
    LLM_UNAVAILABLE = "LLM_UNAVAILABLE"  # 回退耗尽
    RATE_LIMITED = "RATE_LIMITED"
    INTERNAL = "INTERNAL"


# 错误码 -> HTTP 状态
HTTP_STATUS: dict[ErrorCode, int] = {
    ErrorCode.NOT_FOUND: 404,
    ErrorCode.VALIDATION: 422,
    ErrorCode.CONFLICT: 409,
    ErrorCode.CONFLICT_UNRESOLVED: 409,
    ErrorCode.LLM_UNAVAILABLE: 503,
    ErrorCode.RATE_LIMITED: 429,
    ErrorCode.INTERNAL: 500,
}


class AppError(Exception):
    """领域异常：在边界处映射为统一错误信封。"""

    def __init__(
        self,
        code: ErrorCode,
        message: str,
        details: dict[str, object] | None = None,
    ) -> None:
        super().__init__(message)
        self.code = code
        self.message = message
        self.details = details or {}

    @property
    def http_status(self) -> int:
        return HTTP_STATUS.get(self.code, 500)
