from causallearn.graph.Node import Node
from causallearn.graph.GeneralGraph import GeneralGraph
from typing import List, Tuple

"""
Constraint-Based Causal Discovery using Partial Ancestral Graphs in the presence of Cycles
"""


class FCIMixedGraphID():

    def __init__(self, pag: GeneralGraph) -> None:
        self._pag = pag

    def _is_id_ancestral(self, node1: Node, node2: Node) -> bool:
        i = self._pag.node_map[node1]
        j = self._pag.node_map[node2]

    @property
    def id_ancestral() -> List[Tuple[Node, Node]]:
        pass

    def _is_id_non_ancestral(self, node1: Node, node2: Node) -> bool:
        i = self._pag.node_map[node1]
        j = self._pag.node_map[node2]

    @property
    def id_non_ancestral() -> List[Tuple[Node, Node]]:
        pass

    def _is_id_non_confounded(self, node1: Node, node2: Node) -> bool:
        i = self._pag.node_map[node1]
        j = self._pag.node_map[node2]

    @property
    def id_non_confounded() -> List[Tuple[Node, Node]]:
        pass

    def _is_id_direct_cause(self, node1: Node, node2: Node) -> bool:
        i = self._pag.node_map[node1]
        j = self._pag.node_map[node2]

    @property
    def id_direct_cause() -> List[Tuple[Node, Node]]:
        pass

    def _is_id_direct_cause(self, node1: Node, node2: Node) -> bool:
        i = self._pag.node_map[node1]
        j = self._pag.node_map[node2]

    @property
    def id_direct_non_cause() -> List[Tuple[Node, Node]]:
        pass

    def _is_id_non_circle(self, node1: Node) -> bool:
        i = self._pag.node_map[node1]

    @property
    def id_non_circle() -> List[Node]:
        pass

    def acyclification(order: List[Node] = None) -> Tuple[GeneralGraph]:
        pass
