"""
高级群体智能示例
演示使用高级Boids算法和优化功能
"""

from panda3d.core import Vec3
import random
import time

def create_optimized_swarm(swarm_manager):
    """
    创建优化的群体
    使用空间分区和高级行为
    """
    print("创建优化的群体...")
    
    # 配置高级参数
    swarm_manager.config.set("member_count", 200)  # 增加群体规模
    swarm_manager.config.set("cohesion_weight", 1.2)
    swarm_manager.config.set("separation_weight", 1.8)
    swarm_manager.config.set("alignment_weight", 1.0)
    swarm_manager.config.set("perception_radius", 15.0)
    swarm_manager.config.set("max_speed", 8.0)
    
    # 启用物理效果
    swarm_manager.config.set("gravity_enabled", True)
    swarm_manager.config.set("air_resistance_enabled", True)
    
    # 启用空间分区优化
    swarm_manager.config.set("spatial_partitioning", True)
    swarm_manager.config.set("neighbor_search_optimization", True)
    
    # 重新创建群体
    swarm_manager.reset()
    
    print(f"优化群体创建完成，包含{len(swarm_manager.members)}个成员")
    
def create_complex_obstacles(swarm_manager, count=20):
    """
    创建复杂障碍物环境
    """
    print(f"创建{count}个复杂障碍物...")
    
    for i in range(count):
        # 随机位置
        position = Vec3(
            random.uniform(-40, 40),
            random.uniform(-40, 40),
            random.uniform(5, 25)
        )
        # 随机半径
        radius = random.uniform(1, 8)
        
        # 创建障碍物
        swarm_manager.create_obstacle(position, radius)
        
    print(f"复杂障碍物创建完成")
    
def create_hierarchical_flock(swarm_manager):
    """
    创建分层群体结构
    包含领导者和跟随者
    """
    print("创建分层群体结构...")
    
    # 标记前10%的成员为领导者
    leader_count = max(1, len(swarm_manager.members) // 10)
    
    for i, member in enumerate(swarm_manager.members):
        if i < leader_count:
            member['is_leader'] = True
            # 设置领导者颜色
            if 'node' in member:
                member['node'].setColor(0, 1, 0, 1)  # 绿色
        else:
            member['is_leader'] = False
            # 设置跟随者颜色
            if 'node' in member:
                member['node'].setColor(1, 1, 1, 1)  # 白色
                
    # 调整领导者参数
    swarm_manager.config.set("leader_cohesion_weight", 2.0)
    swarm_manager.config.set("leader_separation_weight", 1.0)
    
    print(f"分层群体结构创建完成，{leader_count}个领导者")
    
def create_dynamic_environment(swarm_manager):
    """
    创建动态环境
    包括移动障碍物和变化的目标
    """
    print("创建动态环境...")
    
    # 添加移动障碍物
    moving_obstacle = {
        'position': Vec3(0, 0, 15),
        'radius': 5.0,
        'velocity': Vec3(2, 1, 0),
        'bounds': {'min_x': -30, 'max_x': 30, 'min_y': -30, 'max_y': 30}
    }
    
    swarm_manager.moving_obstacles = [moving_obstacle]
    
    # 设置移动目标
    swarm_manager.set_target(Vec3(20, 20, 15))
    swarm_manager.config.set("seek_enabled", True)
    
    print("动态环境创建完成")
    
def update_dynamic_environment(swarm_manager, dt):
    """
    更新动态环境
    移动障碍物和变化目标
    """
    # 更新移动障碍物
    if hasattr(swarm_manager, 'moving_obstacles'):
        for obstacle in swarm_manager.moving_obstacles:
            # 移动障碍物
            obstacle['position'] += obstacle['velocity'] * dt
            
            # 边界反弹
            bounds = obstacle['bounds']
            if obstacle['position'].x < bounds['min_x'] or obstacle['position'].x > bounds['max_x']:
                obstacle['velocity'].x *= -1
            if obstacle['position'].y < bounds['min_y'] or obstacle['position'].y > bounds['max_y']:
                obstacle['velocity'].y *= -1
                
            # 保持在边界内
            obstacle['position'].x = max(bounds['min_x'], min(bounds['max_x'], obstacle['position'].x))
            obstacle['position'].y = max(bounds['min_y'], min(bounds['max_y'], obstacle['position'].y))
            
    # 定期改变目标位置
    if not hasattr(swarm_manager, 'last_target_change'):
        swarm_manager.last_target_change = time.time()
        
    if time.time() - swarm_manager.last_target_change > 10.0:  # 每10秒改变一次目标
        new_target = Vec3(
            random.uniform(-30, 30),
            random.uniform(-30, 30),
            random.uniform(10, 25)
        )
        swarm_manager.set_target(new_target)
        swarm_manager.last_target_change = time.time()
        
def create_performance_test(swarm_manager):
    """
    创建性能测试场景
    """
    print("创建性能测试场景...")
    
    # 创建大规模群体
    swarm_manager.config.set("member_count", 500)
    swarm_manager.reset()
    
    # 添加大量障碍物
    create_complex_obstacles(swarm_manager, 50)
    
    # 启用所有优化
    swarm_manager.config.set("spatial_partitioning", True)
    swarm_manager.config.set("neighbor_search_optimization", True)
    swarm_manager.config.set("gravity_enabled", True)
    swarm_manager.config.set("air_resistance_enabled", True)
    
    print("性能测试场景创建完成")
    
def run_advanced_example(swarm_manager):
    """
    运行高级示例
    """
    print("=== 高级群体智能示例 ===")
    
    # 创建优化群体
    create_optimized_swarm(swarm_manager)
    
    # 创建复杂环境
    create_complex_obstacles(swarm_manager, 10)
    create_hierarchical_flock(swarm_manager)
    create_dynamic_environment(swarm_manager)
    
    print("高级示例设置完成")
    print("观察群体的复杂行为和优化性能")
    
    return update_dynamic_environment