import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 辅瞄功能服务类：包含配置加载和核心瞄准逻辑
 */
public class AuxiliaryAimingService {
    // 辅瞄配置（初始化后从外部加载数据）
    private AuxiliaryAimingConfig config;
    // 辅瞄触发开关（从配置中读取）
    private boolean isAuxiliaryAimingEnabled;
    // 最大瞄准距离阈值（从配置中解析：30m）
    private final double MAX_AIM_DISTANCE = 30.0;

    /**
     * 1. 初始化配置（模拟从原配置加载数据，实际可对接配置文件/数据库）
     */
    public void initConfig() {
        // 1.1 构建 [AuxiliarySighting] 模块数据
        AuxiliaryAimingConfig.AuxiliarySightingModule sightingModule = new AuxiliaryAimingConfig.AuxiliarySightingModule();
        sightingModule.setAuxiliarySighting(true); // 对应原配置 AuxiliarySighting=true

        // 1.2 构建 [SourceVersion] 模块数据
        AuxiliaryAimingConfig.SourceVersionModule versionModule = new AuxiliaryAimingConfig.SourceVersionModule();
        versionModule.setAppVersion("1.32.11");
        versionModule.setSrcVersion("1.32.11.14017");

        // 1.3 构建 [AuxiliarySighting.Set] 模块数据（对应原配置的复杂参数）
        Map<String, Object> sightingSet = Map.of(
                "AuxiliarySighting@TriggerTransitionRoleCharactersLocation", "Head", // 瞄准部位：头部
                "AuxiliaryAiming@Trigger.Transition.Enemy.Role.Character.Head.Speed", "0.5s", // 头部瞄准过渡速度
                "AuxiliaryAiming@Trigger.Transition.Enemy.Role.Character.Distance_Condition", "<30m" // 距离条件
        );

        // 1.4 组装总配置
        config = new AuxiliaryAimingConfig();
        config.setAuxiliarySighting(sightingModule);
        config.setSourceVersion(versionModule);
        config.setAuxiliarySightingSet(sightingSet);

        // 1.5 初始化辅瞄开关（从配置中读取）
        this.isAuxiliaryAimingEnabled = config.getAuxiliarySighting().isAuxiliarySighting();
        System.out.println("辅瞄配置初始化完成，辅瞄开关状态：" + (isAuxiliaryAimingEnabled ? "开启" : "关闭"));
    }

    /**
     * 2. 核心逻辑：辅瞄触发时，优先筛选30米内的敌人并瞄准
     * @param enemies 当前场景中所有敌人列表
     * @return 优先瞄准的目标（30米内敌人，无则返回null）
     */
    public Enemy triggerAuxiliaryAiming(List<Enemy> enemies) {
        // 先判断辅瞄是否开启
        if (!isAuxiliaryAimingEnabled) {
            System.out.println("辅瞄未开启，不执行瞄准逻辑");
            return null;
        }

        // 筛选：仅保留30米内的敌人（核心条件）
        List<Enemy> enemiesWithin30m = new ArrayList<>();
        for (Enemy enemy : enemies) {
            double distanceToPlayer = enemy.getDistanceToPlayer(); // 敌人到玩家的距离（单位：米）
            if (distanceToPlayer <= MAX_AIM_DISTANCE) {
                enemiesWithin30m.add(enemy);
            }
        }

        // 优先瞄准逻辑：30米内有敌人则取第一个（可根据需求扩展排序，如“最近优先”“头部暴露优先”）
        if (!enemiesWithin30m.isEmpty()) {
            Enemy target = enemiesWithin30m.get(0); // 此处简化为“第一个30米内敌人”，可按需调整
            System.out.printf("辅瞄触发：优先瞄准30米内敌人【距离：%.1f米，瞄准部位：Head】%n", 
                    target.getDistanceToPlayer());
            return target;
        } else {
            System.out.println("30米内无敌人，辅瞄未锁定目标");
            return null;
        }
    }

    // 敌人实体类（模拟场景中的敌人数据）
    @Data
    public static class Enemy {
        private String enemyId;          // 敌人ID
        private double distanceToPlayer; // 敌人到玩家的距离（单位：米）
        private String exposedPart;      // 暴露部位（如Head/Body）
    }

    // ------------------- 测试示例 -------------------
    public static void main(String[] args) {
        // 1. 初始化辅瞄服务
        AuxiliaryAimingService aimingService = new AuxiliaryAimingService();
        aimingService.initConfig();

        // 2. 模拟场景：生成3个敌人（距离分别为25m、35m、28m）
        List<Enemy> enemies = new ArrayList<>();
        Enemy enemy1 = new Enemy();
        enemy1.setEnemyId("Enemy_001");
        enemy1.setDistanceToPlayer(25.0);
        enemy1.setExposedPart("Head");

        Enemy enemy2 = new Enemy();
        enemy2.setEnemyId("Enemy_002");
        enemy2.setDistanceToPlayer(35.0); // 超过30m，不纳入优先瞄准
        enemy2.setExposedPart("Body");

        Enemy enemy3 = new Enemy();
        enemy3.setEnemyId("Enemy_003");
        enemy3.setDistanceToPlayer(28.0);
        enemy3.setExposedPart("Head");

        enemies.add(enemy1);
        enemies.add(enemy2);
        enemies.add(enemy3);

        // 3. 触发辅瞄，查看结果
        aimingService.triggerAuxiliaryAiming(enemies);
    }
}
