from cubicweb import AuthenticationError
from pyramid.config import Configurator

from cubicweb_api import ApiException


class AnonymousOrConnectedUserPredicate:
    def __init__(self, value, config):
        self.value = value

    def text(self):
        return f"anonymous_or_connected = {self.value}"

    phash = text

    def __call__(self, context, request):
        if (
            request.authenticated_userid is not None
            or request.registry["cubicweb.repository"].config["anonymous-user"]
            is not None
        ):
            return True
        raise ApiException(AuthenticationError())


def includeme(config: Configurator):
    config.add_view_predicate(
        "anonymous_or_connected", AnonymousOrConnectedUserPredicate
    )