class ClientError(Exception):
    def __init__(self, message: str) -> None:
        """クライアントのリクエストが不正な場合のエラー"""
        super().__init__(message)
        self.message = message


class ServerError(Exception):
    def __init__(self, message: str) -> None:
        """サーバーの状態が不正な場合のエラー"""
        super().__init__(message)
        self.message = message


class ResourceNotFoundError(ClientError):
    def __init__(self, message: str) -> None:
        """リソースが見つからない場合のエラー"""
        super().__init__(message)


class ResourceDuplicatedError(ClientError):
    def __init__(self, message: str, duplicated_field: str | None = None) -> None:
        """リソースが重複している場合のエラー"""
        super().__init__(message)
        self.duplicated_field = duplicated_field


class BulkDuplicatedError(ClientError):
    def __init__(self, message: str, duplicated_fields: list[str]) -> None:
        """一括操作でリソースが重複している場合のエラー

        duplicated_fields: 重複したパラメータ名のリスト (例: ["users[0].display_id", "users[2].email"])
        """
        super().__init__(message)
        self.duplicated_fields = duplicated_fields


class NonUniqueCustomerIdError(ServerError):
    def __init__(self, message: str) -> None:
        """customer_idでTenantを一意に特定できない場合のエラー"""
        super().__init__(message)


class PriceCodeNotFoundError(ResourceNotFoundError):
    def __init__(self, message: str) -> None:
        """コードが見つからない場合のエラー"""
        super().__init__(message)


class UnauthorizedServiceError(ClientError):
    def __init__(self, message: str) -> None:
        """サービス名が不正な場合のエラー"""
        super().__init__(message)


class IdentityProviderError(ServerError):
    def __init__(self, message: str) -> None:
        """サービス管理のID基盤との通信に失敗した場合のエラー"""
        super().__init__(message)


class AlreadyInitializedError(ClientError):
    def __init__(self, message: str) -> None:
        """既に初期化されている場合のエラー"""
        super().__init__(message)


class NotificationError(Exception):
    def __init__(self, message: str) -> None:
        """通知処理が失敗した場合のエラー"""
        super().__init__(message)
        self.message = message
