import graphene
from graphene import relay

from books.schema.nodes import ModuleNode, TopicNode, ChapterNode, SnapshotChapterNode


class NodeConnection(relay.Connection):
    """
    Custom connection type, so we don't need to deal with the edges and nodes if we don't want to, while still
    adhering to the relay specification
    Idea from: https://javascript.plainenglish.io/graphql-pagination-using-edges-vs-nodes-in-connections-f2ddb8edffa0

    Always has property called `nodes` which is filled with the Meta node class.

    Example:
        class TopicConnection(NodeConnection):
            class Meta:
                node = TopicNode
            # will have
            # nodes = graphene.List(TopicNode)

    """

    class Meta:
        abstract = True

    def resolve_nodes(self, *args, **kwargs):
        return [edge.node for edge in self.edges]

    @classmethod
    def __init_subclass_with_meta__(cls, node=None, name=None, **options):
        cls.nodes = graphene.List(node)
        return super().__init_subclass_with_meta__(
            node, name, **options
        )


class TopicConnection(NodeConnection):
    class Meta:
        node = TopicNode


class ModuleConnection(NodeConnection):
    class Meta:
        node = ModuleNode
