from typing import List
from abc import abstractmethod
from typing import Protocol

class GraphDBInterface(Protocol):

    """ Save and Load Graphs """

    @abstractmethod
    async def graph(self):
        raise NotImplementedError

    @abstractmethod
    async def save_graph_to_file(
        self,
        file_path: str = None
    ): raise NotImplementedError

    @abstractmethod
    async def load_graph_from_file(
        self,
        file_path: str = None
    ): raise NotImplementedError

    @abstractmethod
    async def delete_graph_from_file(
        self,
        path: str = None
    ): raise NotImplementedError

    """ CRUD operations on graph nodes """

    @abstractmethod

    async def add_node(
        self,
        id: str,
        **kwargs
    ): raise NotImplementedError

    @abstractmethod
    async def delete_node(
        self,
        id: str
    ): raise NotImplementedError


    """ CRUD operations on graph edges """


    @abstractmethod
    async def add_edge(
        self,
        from_node: str,
        to_node: str,
        **kwargs
    ): raise NotImplementedError


    # @abstractmethod
    # async def create_vector_index(
    #     self,
    #     collection_name: str,
    #     vector_index_config: object
    # ): raise NotImplementedError

    # @abstractmethod
    # async def create_data_index(
    #     self,
    #     collection_name: str,
    #     vector_index_config: object
    # ): raise NotImplementedError

    # """ Data points """
    # @abstractmethod
    # async def create_data_points(
    #     self,
    #     collection_name: str,
    #     data_points: List[any]
    # ): raise NotImplementedError

    # @abstractmethod
    # async def get_data_point(
    #     self,
    #     collection_name: str,
    #     data_point_id: str
    # ): raise NotImplementedError

    # @abstractmethod
    # async def update_data_point(
    #     self,
    #     collection_name: str,
    #     data_point_id: str,
    #     payload: object
    # ): raise NotImplementedError

    # @abstractmethod
    # async def delete_data_point(
    #     self,
    #     collection_name: str,
    #     data_point_id: str
    # ): raise NotImplementedError
