"""
pta — Prefix-Tree Automaton (PTA) construction.

Nach Bex et al. 2008/2010: Der PTA ist der initiale Automat, der aus
den positiven Beispielsequenzen (Token-Sequenzen) konstruiert wird.

Jede Sequenz wird als Pfad im Trie abgebildet:
  - Wurzel = Startzustand
  - Jeder gemeinsame Prefix wird geteilt (wie im Trie)
  - Der letzte Zustand jeder Sequenz wird als accept markiert

Der PTA ist deterministisch und akzeptiert genau die gegebenen Sequenzen.
Er ist der Ausgangspunkt für die SORE/CHARE-Inferenz via shrink-Rewrites.
"""

from .automaton import Automaton


def build_pta(sequences):
    """
    Konstruiert den Prefix-Tree Automaton aus einer Liste von Token-Sequenzen.

    Nach Bex et al. 2008/2010, Algorithmus PTA:
      - Initialisiere mit Startzustand q0
      - Für jede Sequenz w = a1...an:
        - Starte in q0
        - Für jedes ai: Folge der Kante (q, ai) falls vorhanden,
          sonst erzeuge neuen Zustand q' und Kante (q, q', ai)
        - Markiere Endzustand als accept

    Args:
        sequences: Liste von Token-Listen (jede = ein YAML-Dokument)

    Returns:
        Automaton: PTA für die gegebenen Sequenzen

    Example:
        >>> build_pta([["apt", "service"], ["apt", "template", "service"]])
        Automaton(nodes=5, edges=5, start=0, accepts={3, 4})
    """
    automaton = Automaton(start=0)
    automaton.add_node(0)

    next_id = 1

    for seq in sequences:
        current = 0
        for token in seq:
            found = False
            for (to, label) in automaton.successors(current):
                if label == token:
                    current = to
                    found = True
                    break
            if not found:
                new_node = next_id
                next_id += 1
                automaton.add_edge(current, new_node, token)
                current = new_node
        automaton.add_accept(current)

    return automaton
