#!/usr/bin/env python3
"""
Interactive Visibility Demo
==========================

Controls:
  - WASD: Move the player (green @)
  - Arrow keys: Move enemy (red E)
  - Tab: Cycle perspective (Omniscient → Player → Enemy → Omniscient)
  - Space: Update visibility for current entity
  - R: Reset positions
"""

import mcrfpy
import sys

# Create scene and grid
mcrfpy.createScene("visibility_demo")
grid = mcrfpy.Grid(grid_x=30, grid_y=20)
grid.fill_color = mcrfpy.Color(20, 20, 30)  # Dark background

# Initialize grid - all walkable and transparent
for y in range(20):
    for x in range(30):
        cell = grid.at(x, y)
        cell.walkable = True
        cell.transparent = True
        cell.color = mcrfpy.Color(100, 100, 120)  # Floor color

# Create walls
walls = [
    # Central cross
    [(15, y) for y in range(8, 12)],
    [(x, 10) for x in range(13, 18)],
    
    # Rooms
    # Top-left room
    [(x, 5) for x in range(2, 8)] + [(8, y) for y in range(2, 6)],
    [(2, y) for y in range(2, 6)] + [(x, 2) for x in range(2, 8)],
    
    # Top-right room  
    [(x, 5) for x in range(22, 28)] + [(22, y) for y in range(2, 6)],
    [(28, y) for y in range(2, 6)] + [(x, 2) for x in range(22, 28)],
    
    # Bottom-left room
    [(x, 15) for x in range(2, 8)] + [(8, y) for y in range(15, 18)],
    [(2, y) for y in range(15, 18)] + [(x, 18) for x in range(2, 8)],
    
    # Bottom-right room
    [(x, 15) for x in range(22, 28)] + [(22, y) for y in range(15, 18)],
    [(28, y) for y in range(15, 18)] + [(x, 18) for x in range(22, 28)],
]

for wall_group in walls:
    for x, y in wall_group:
        if 0 <= x < 30 and 0 <= y < 20:
            cell = grid.at(x, y)
            cell.walkable = False
            cell.transparent = False
            cell.color = mcrfpy.Color(40, 20, 20)  # Wall color

# Create entities
player = mcrfpy.Entity(5, 10, grid=grid)
player.sprite_index = 64  # @
enemy = mcrfpy.Entity(25, 10, grid=grid)
enemy.sprite_index = 69  # E

# Update initial visibility
player.update_visibility()
enemy.update_visibility()

# Global state
current_perspective = -1
perspective_names = ["Omniscient", "Player", "Enemy"]

# UI Setup
ui = mcrfpy.sceneUI("visibility_demo")
ui.append(grid)
grid.position = (50, 100)
grid.size = (900, 600)  # 30*30, 20*30

# Title
title = mcrfpy.Caption("Interactive Visibility Demo", 350, 20)
title.fill_color = mcrfpy.Color(255, 255, 255)
ui.append(title)

# Info displays
perspective_label = mcrfpy.Caption("Perspective: Omniscient", 50, 50)
perspective_label.fill_color = mcrfpy.Color(200, 200, 200)
ui.append(perspective_label)

controls = mcrfpy.Caption("WASD: Move player | Arrows: Move enemy | Tab: Cycle perspective | Space: Update visibility | R: Reset", 50, 730)
controls.fill_color = mcrfpy.Color(150, 150, 150)
ui.append(controls)

player_info = mcrfpy.Caption("Player: (5, 10)", 700, 50)
player_info.fill_color = mcrfpy.Color(100, 255, 100)
ui.append(player_info)

enemy_info = mcrfpy.Caption("Enemy: (25, 10)", 700, 70)
enemy_info.fill_color = mcrfpy.Color(255, 100, 100)
ui.append(enemy_info)

# Helper functions
def move_entity(entity, dx, dy):
    """Move entity if target is walkable"""
    new_x = int(entity.x + dx)
    new_y = int(entity.y + dy)
    
    if 0 <= new_x < 30 and 0 <= new_y < 20:
        cell = grid.at(new_x, new_y)
        if cell.walkable:
            entity.x = new_x
            entity.y = new_y
            entity.update_visibility()
            return True
    return False

def update_info():
    """Update info displays"""
    player_info.text = f"Player: ({int(player.x)}, {int(player.y)})"
    enemy_info.text = f"Enemy: ({int(enemy.x)}, {int(enemy.y)})"

def cycle_perspective():
    """Cycle through perspectives"""
    global current_perspective
    
    # Cycle: -1 → 0 → 1 → -1
    current_perspective = (current_perspective + 2) % 3 - 1
    
    grid.perspective = current_perspective
    name = perspective_names[current_perspective + 1]
    perspective_label.text = f"Perspective: {name}"

# Key handlers
def handle_keys(key, state):
    """Handle keyboard input"""
    if state == "end": return
    key = key.lower()
    # Player movement (WASD)
    if key == "w":
        move_entity(player, 0, -1)
    elif key == "s":
        move_entity(player, 0, 1)
    elif key == "a":
        move_entity(player, -1, 0)
    elif key == "d":
        move_entity(player, 1, 0)
    
    # Enemy movement (Arrows)
    elif key == "up":
        move_entity(enemy, 0, -1)
    elif key == "down":
        move_entity(enemy, 0, 1)
    elif key == "left":
        move_entity(enemy, -1, 0)
    elif key == "right":
        move_entity(enemy, 1, 0)
    
    # Tab to cycle perspective
    elif key == "tab":
        cycle_perspective()
    
    # Space to update visibility
    elif key == "space":
        player.update_visibility()
        enemy.update_visibility()
        print("Updated visibility for both entities")
    
    # R to reset
    elif key == "r":
        player.x, player.y = 5, 10
        enemy.x, enemy.y = 25, 10
        player.update_visibility()
        enemy.update_visibility()
        update_info()
        print("Reset positions")
    
    # Q to quit
    elif key == "q":
        print("Exiting...")
        sys.exit(0)
    
    update_info()

# Set scene first
mcrfpy.setScene("visibility_demo")

# Register key handler (operates on current scene)
mcrfpy.keypressScene(handle_keys)

print("Interactive Visibility Demo")
print("===========================")
print("WASD: Move player (green @)")
print("Arrows: Move enemy (red E)")
print("Tab: Cycle perspective")
print("Space: Update visibility")
print("R: Reset positions")
print("Q: Quit")
print("\nCurrent perspective: Omniscient (shows all)")
print("Try moving entities and switching perspectives!")
