from __future__ import annotations

from typing import Any


class SessionServiceError(Exception):
    """Session 服务统一错误。"""

    def __init__(
        self,
        *,
        code: str,
        message: str,
        status_code: int,
        details: dict[str, Any] | None = None,
    ) -> None:
        super().__init__(message)
        self.code = code
        self.message = message
        self.status_code = status_code
        self.details = details


class InvalidSessionConfigError(SessionServiceError):
    def __init__(self, message: str = "invalid session config") -> None:
        super().__init__(
            code="INVALID_SESSION_CONFIG",
            message=message,
            status_code=400,
        )


class SessionNotFoundServiceError(SessionServiceError):
    def __init__(self, message: str = "session not found") -> None:
        super().__init__(
            code="SESSION_NOT_FOUND",
            message=message,
            status_code=404,
        )


class InvalidPaginationError(SessionServiceError):
    def __init__(self, *, offset: int, limit: int) -> None:
        super().__init__(
            code="INVALID_PAGINATION",
            message="invalid pagination params",
            status_code=400,
            details={"offset": offset, "limit": limit},
        )


class RuntimeNotSupportedError(SessionServiceError):
    def __init__(self, message: str = "runtime unavailable") -> None:
        super().__init__(
            code="RUNTIME_NOT_SUPPORTED_IN_IMAGE",
            message=message,
            status_code=400,
        )


class RuntimeSessionCreateFailedError(SessionServiceError):
    def __init__(self, message: str = "runtime session create failed") -> None:
        super().__init__(
            code="RUNTIME_SESSION_CREATE_FAILED",
            message=message,
            status_code=502,
        )


class RuntimeSessionDeleteFailedError(SessionServiceError):
    def __init__(self, message: str = "runtime session delete failed") -> None:
        super().__init__(
            code="RUNTIME_SESSION_DELETE_FAILED",
            message=message,
            status_code=502,
        )


class RuntimeSessionAbortFailedError(SessionServiceError):
    def __init__(self, message: str = "runtime session abort failed") -> None:
        super().__init__(
            code="RUNTIME_SESSION_ABORT_FAILED",
            message=message,
            status_code=502,
        )