class DefaultEditUtils:
    def __init__(self, request):
        self.request = request

    @classmethod
    def from_obj(cls, obj, request):
        return cls(request)

    @property
    def can_access_child_base_mapdata(self):
        return self.request.user_permissions.can_access_base_mapdata

    @property
    def can_create(self):
        return self.can_access_child_base_mapdata

    @property
    def _geometry_url(self):
        return None

    @property
    def geometry_url(self):
        return self._geometry_url if self.can_access_child_base_mapdata else None


class LevelChildEditUtils(DefaultEditUtils):
    def __init__(self, level, request):
        super().__init__(request)
        self.level = level

    @classmethod
    def from_obj(cls, obj, request):
        return cls(obj.level, request)

    @property
    def _geometry_url(self):
        return '/api/editor/geometries/?level=' + str(self.level.primary_level_pk)


class SpaceChildEditUtils(DefaultEditUtils):
    def __init__(self, space, request):
        super().__init__(request)
        self.space = space

    @classmethod
    def from_obj(cls, obj, request):
        return cls(obj.space, request)

    @property
    def can_access_child_base_mapdata(self):
        return (self.request.user_permissions.can_access_base_mapdata or
                self.space.base_mapdata_accessible or
                self.space.pk in self.request.user_space_accesses)

    @property
    def _geometry_url(self):
        return '/api/editor/geometries/?space='+str(self.space.pk)
