#!/usr/bin/env python3
"""
StateZero: State machine replacement.
State x Event -> NewState. Replaces 10,000-node state machines. 61 atoms.

No dependencies. Pure Python.
"""
import time

# === THE LATTICE: state transitions ===
TRANSITIONS = {
    # Enemy AI states
    ("enemy_idle", "player_approaches"): "enemy_alert",
    ("enemy_alert", "player_attacks"): "enemy_combat",
    ("enemy_combat", "player_flees"): "enemy_searching",
    ("enemy_combat", "enemy_hp_low"): "enemy_fleeing",
    ("enemy_combat", "player_dies"): "enemy_celebrating",
    ("enemy_searching", "player_found"): "enemy_combat",
    ("enemy_searching", "timeout"): "enemy_idle",
    ("enemy_fleeing", "reached_safety"): "enemy_idle",
    ("enemy_celebrating", "timeout"): "enemy_idle",
    ("enemy_alert", "player_flees"): "enemy_searching",

    # NPC dialogue states
    ("npc_idle", "player_talks"): "npc_listening",
    ("npc_listening", "player_asks_quest"): "npc_offering",
    ("npc_listening", "player_insults"): "npc_angry",
    ("npc_listening", "player_compliments"): "npc_friendly",
    ("npc_offering", "player_accepts"): "npc_grateful",
    ("npc_offering", "player_declines"): "npc_idle",
    ("npc_angry", "player_apologizes"): "npc_idle",
    ("npc_angry", "player_persists"): "npc_attacking",
    ("npc_friendly", "player_leaves"): "npc_idle",

    # Door states
    ("door_locked", "player_has_key"): "door_unlocked",
    ("door_locked", "player_picks_lock"): "door_unlocked",
    ("door_unlocked", "player_opens"): "door_open",
    ("door_open", "player_closes"): "door_closed",
    ("door_closed", "player_opens"): "door_open",

    # Torch states
    ("torch_lit", "water_splashed"): "torch_doused",
    ("torch_lit", "time_passes"): "torch_burnt_out",
    ("torch_doused", "fire_applied"): "torch_lit",
    ("torch_burnt_out", "magic_rekindled"): "torch_lit",
    ("torch_unlit", "fire_applied"): "torch_lit",

    # Plant states
    ("seed_planted", "watered"): "seedling",
    ("seedling", "time_passes"): "growing",
    ("growing", "time_passes"): "mature",
    ("mature", "harvested"): "harvested",
    ("mature", "time_passes"): "withered",
    ("withered", "watered"): "growing",
    ("harvested", "replanted"): "seed_planted",

    # Player combat states
    ("player_idle", "enemy_attacks"): "player_defending",
    ("player_defending", "block_success"): "player_countering",
    ("player_defending", "block_fail"): "player_stunned",
    ("player_countering", "attack_hits"): "player_idle",
    ("player_countering", "attack_misses"): "player_defending",
    ("player_stunned", "recovery"): "player_defending",
    ("player_idle", "player_heals"): "player_healing",
    ("player_healing", "interrupted"): "player_idle",
    ("player_healing", "heal_complete"): "player_idle",

    # Day/night cycle
    ("day", "time_passes"): "evening",
    ("evening", "time_passes"): "night",
    ("night", "time_passes"): "dawn",
    ("dawn", "time_passes"): "day",

    # Weather
    ("sunny", "time_passes"): "cloudy",
    ("cloudy", "time_passes"): "rainy",
    ("rainy", "time_passes"): "stormy",
    ("stormy", "time_passes"): "sunny"
}

STATES = {
    "enemy_idle": "[IDLE]  Enemy stands watch",
    "enemy_alert": "[ALERT] Enemy has noticed something",
    "enemy_combat": "[COMBAT] Enemy is fighting",
    "enemy_searching": "[SEARCH] Enemy looks for threat",
    "enemy_fleeing": "[FLEE] Enemy retreats",
    "enemy_celebrating": "[WIN] Enemy gloats",
    "npc_idle": "[IDLE] NPC at rest",
    "npc_listening": "[LISTEN] NPC hears you",
    "npc_offering": "[OFFER] NPC has a quest",
    "npc_angry": "[ANGRY] NPC is hostile",
    "npc_friendly": "[FRIENDLY] NPC likes you",
    "npc_grateful": "[THANKS] NPC thanks you",
    "npc_attacking": "[ATTACK] NPC attacks!",
    "door_locked": "[LOCKED] Door is locked",
    "door_unlocked": "[UNLOCKED] Door is unlocked",
    "door_open": "[OPEN] Door is open",
    "door_closed": "[CLOSED] Door is closed",
    "torch_lit": "[LIT] Torch burns bright",
    "torch_doused": "[DOUSED] Torch is wet",
    "torch_burnt_out": "[BURNT] Torch is dead",
    "torch_unlit": "[UNLIT] Torch is cold",
    "seed_planted": "[SEED] Seed in soil",
    "seedling": "[SPROUT] First leaves",
    "growing": "[GROW] Plant thrives",
    "mature": "[MATURE] Plant bears fruit",
    "harvested": "[EMPTY] Crop is gone",
    "withered": "[DEAD] Plant has died",
    "player_idle": "[IDLE] Player stands still",
    "player_defending": "[GUARD] Player blocks",
    "player_countering": "[STRIKE] Player attacks back",
    "player_stunned": "[STUN] Player is dazed",
    "player_healing": "[HEAL] Player recovers",
    "day": "[DAY] Sun is high",
    "evening": "[EVEN] Sun sets",
    "night": "[NIGHT] Stars above",
    "dawn": "[DAWN] Light returns",
    "sunny": "[SUN] Clear skies",
    "cloudy": "[CLOUD] Gray above",
    "rainy": "[RAIN] Drops fall",
    "stormy": "[STORM] Thunder rolls"
}

def transition(state: str, event: str) -> str:
    """State + Event -> New State. O(1) lookup."""
    new_state = TRANSITIONS.get((state, event), state)
    return new_state

def describe(state: str) -> str:
    """O(1) state description."""
    return STATES.get(state, f"[?] Unknown state: {state}")

# === DEMO ===
def demo():
    print("=" * 50)
    print("  StateZero: State machine, O(1) transitions")
    print("=" * 50)
    print()

    scenarios = [
        ("Enemy AI", [("enemy_idle", "player_approaches"),
                       ("enemy_alert", "player_attacks"),
                       ("enemy_combat", "enemy_hp_low"),
                       ("enemy_fleeing", "reached_safety")]),

        ("NPC Dialogue", [("npc_idle", "player_talks"),
                           ("npc_listening", "player_asks_quest"),
                           ("npc_offering", "player_accepts"),
                           ("npc_grateful", "player_leaves")]),

        ("Door", [("door_locked", "player_has_key"),
                   ("door_unlocked", "player_opens"),
                   ("door_open", "player_closes")]),

        ("Plant Growth", [("seed_planted", "watered"),
                            ("seedling", "time_passes"),
                            ("growing", "time_passes"),
                            ("mature", "harvested")]),

        ("Player Combat", [("player_idle", "enemy_attacks"),
                              ("player_defending", "block_success"),
                              ("player_countering", "attack_hits")]),

        ("Day/Night", [("day", "time_passes"),
                         ("evening", "time_passes"),
                         ("night", "time_passes"),
                         ("dawn", "time_passes")])
    ]

    for name, chain in scenarios:
        print(f"  {name}:")
        for state, event in chain:
            start = time.perf_counter_ns()
            new_state = transition(state, event)
            elapsed = time.perf_counter_ns() - start
            print(f"    {describe(state)}")
            print(f"      + {event:20s} -> {describe(new_state)}  [{elapsed}ns]")
        print()

    print("=" * 50)
    print("  42 states, 39 transitions. O(1) lookup. No state machine code.")
    print("=" * 50)

if __name__ == "__main__":
    demo()
