"""
环境感知示例
演示如何使用环境感知和响应机制
"""

from panda3d.core import Vec3
import sys
import os

# 添加插件路径
plugin_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, plugin_dir)

from swarm_manager import SwarmManager
from config import Config

def create_environment_demo(world):
    """
    创建环境感知演示
    """
    print("创建环境感知演示...")
    
    # 创建群体管理器
    swarm_manager = SwarmManager(world)
    
    # 配置环境感知参数
    config = swarm_manager.config
    
    # 启用环境感知
    config.set("environment_awareness_enabled", True)
    
    # 设置传感器参数
    config.set("sensor_range", 20.0)  # 增加传感器范围
    config.set("sensor_accuracy", 0.95)  # 提高传感器精度
    
    # 设置环境响应权重
    config.set("obstacle_response_weight", 2.5)
    config.set("predator_response_weight", 3.5)
    config.set("resource_seek_weight", 0.8)
    config.set("hazard_avoid_weight", 4.0)
    
    # 创建示例群体
    swarm_manager.create_example_swarm("鸟类", 30)
    
    # 添加环境元素
    # 1. 添加障碍物
    swarm_manager.create_obstacle(Vec3(10, 10, 5), 3.0)
    swarm_manager.create_obstacle(Vec3(-15, 5, 8), 2.5)
    swarm_manager.create_obstacle(Vec3(0, -20, 3), 4.0)
    
    # 2. 添加捕食者
    predator = swarm_manager.create_predator(Vec3(25, 0, 10))
    
    # 3. 添加资源点
    if hasattr(swarm_manager, 'environment_manager'):
        swarm_manager.environment_manager.add_resource(Vec3(-10, 15, 5), "食物", 100.0)
        swarm_manager.environment_manager.add_resource(Vec3(20, -10, 7), "水源", 80.0)
    
    # 4. 添加危险区域
    if hasattr(swarm_manager, 'environment_manager'):
        swarm_manager.environment_manager.add_hazard(Vec3(5, 0, 5), "有毒气体", 6.0)
        swarm_manager.environment_manager.add_hazard(Vec3(-25, -15, 3), "辐射区", 8.0)
    
    # 设置目标点（让群体向目标移动，观察环境响应）
    swarm_manager.set_target(Vec3(30, 30, 15))
    config.set("seek_enabled", True)
    
    print("环境感知演示创建完成")
    print(f"- 群体成员数量: {len(swarm_manager.members)}")
    print(f"- 障碍物数量: {len(swarm_manager.obstacles)}")
    print(f"- 捕食者数量: {len(swarm_manager.predators)}")
    
    if hasattr(swarm_manager, 'environment_manager'):
        env_info = swarm_manager.environment_manager.get_environment_info()
        print(f"- 资源点数量: {len(env_info.get('resources', []))}")
        print(f"- 危险区域数量: {len(env_info.get('hazards', []))}")
    
    return swarm_manager

def update_environment_demo(swarm_manager, dt):
    """
    更新环境感知演示
    """
    # 更新环境时间
    if hasattr(swarm_manager, 'environment_manager'):
        swarm_manager.environment_manager.advance_time(dt)
        swarm_manager.environment_manager.update_environment_dynamics()
    
    # 可以在这里添加动态环境变化
    # 例如：移动障碍物、改变天气等

def demo_environment_awareness_features():
    """
    演示环境感知特性的使用方法
    """
    print("=== 环境感知特性演示 ===")
    
    # 1. 传感器配置
    print("1. 传感器配置:")
    print("   - sensor_range: 传感器的感知范围")
    print("   - sensor_accuracy: 传感器的精度 (0.0-1.0)")
    
    # 2. 环境响应权重
    print("2. 环境响应权重:")
    print("   - obstacle_response_weight: 避障响应权重")
    print("   - predator_response_weight: 躲避捕食者响应权重")
    print("   - resource_seek_weight: 寻找资源响应权重")
    print("   - hazard_avoid_weight: 避开危险区域响应权重")
    
    # 3. 环境元素
    print("3. 环境元素:")
    print("   - obstacles: 障碍物")
    print("   - predators: 捕食者")
    print("   - resources: 资源点")
    print("   - hazards: 危险区域")
    
    # 4. 环境动态
    print("4. 环境动态:")
    print("   - time_of_day: 时间变化")
    print("   - weather: 天气变化")
    print("   - resource regeneration: 资源恢复")

if __name__ == "__main__":
    # 如果直接运行此脚本，显示特性说明
    demo_environment_awareness_features()