"""Generators for some lattice hypergraphs.

All the functions in this module return a Hypergraph class (i.e. a simple, undirected
hypergraph).

"""

from warnings import warn

from ..exception import XGIError

__all__ = [
    "ring_lattice",
]


def ring_lattice(n, d, k, l):
    """A ring lattice hypergraph.

    A d-uniform hypergraph on n nodes where each node is part of k edges and the
    overlap between consecutive edges is d-l.

    Parameters
    ----------
    n : int
        Number of nodes
    d : int
        Edge size
    k : int
        Number of edges of which a node is a part. Should be a multiple of 2.
    l : int
        Overlap between edges

    Returns
    -------
    Hypergraph
        The generated hypergraph

    Raises
    ------
    XGIError
        If k is negative.

    Notes
    -----
    ring_lattice(n, 2, k, 0) is a ring lattice graph where each node has k//2 edges on
    either side.

    """
    from ..core import Hypergraph

    if k < 0:
        raise XGIError("Invalid k value!")

    if k < 2:
        warn("This creates a completely disconnected hypergraph!")

    if k % 2 != 0:
        warn("k is not divisible by 2")

    edges = [
        [node] + [(start + l + i) % n for i in range(d - 1)]
        for node in range(n)
        for start in range(node + 1, node + k // 2 + 1)
    ]
    H = Hypergraph(edges)
    H.add_nodes_from(range(n))
    return H
