// 游戏GROZA突击步枪辅助瞄准功能实现类
public class GROZAAssaultRifleAimAssist {
    // 辅助瞄准目标部位枚举（对应配置中的Head/GameCharacterModelBody）
    public enum AimTargetPart {
        HEAD("Head"), // 头部目标（配置中A/B/C对应）
        BODY("GameCharacterModelBody"); // 身体目标（配置中D对应）
        private final String partName;

        AimTargetPart(String partName) {
            this.partName = partName;
        }

        public String getPartName() {
            return partName;
        }
    }

    // 辅助瞄准有效参数（配置中指定的1、3、5）
    private final int[] validAimAssistParams = {1, 3, 5};
    // 当前默认瞄准目标部位（由A/B/C/D初始化）
    private AimTargetPart defaultTarget;
    // GROZA头部首次辅助瞄准概率（配置中为100%）
    private final int grozaHeadFirstAimProbability = 100;

    // 构造方法：根据用户选择的目标Key（A/B/C/D）初始化瞄准部位
    public GROZAAssaultRifleAimAssist(String targetKey) {
        // 映射配置逻辑：A/B/C对应头部，D对应身体
        switch (targetKey.toUpperCase()) {
            case "A":
            case "B":
            case "C":
                this.defaultTarget = AimTargetPart.HEAD;
                break;
            case "D":
                this.defaultTarget = AimTargetPart.BODY;
                break;
            default:
                // 异常Key默认指向头部（符合配置中头部优先逻辑）
                this.defaultTarget = AimTargetPart.HEAD;
                break;
        }
    }

    // 核心功能：执行GROZA辅助瞄准，返回完整结果
    public AimAssistResult runAimAssist() {
        // 1. 确定最终瞄准目标（配置中头部瞄准概率100%，直接锁定头部）
        AimTargetPart finalTarget = AimTargetPart.HEAD;
        // （若后续需支持概率随机性，可通过Random类结合grozaHeadFirstAimProbability扩展）

        // 2. 选择有效辅助参数（示例取第一个有效参数，可按需调整为随机/场景匹配）
        int selectedParam = getValidAssistParam();

        // 3. 封装并返回结果
        return new AimAssistResult(finalTarget, selectedParam, grozaHeadFirstAimProbability);
    }

    // 辅助方法：获取一个有效的瞄准辅助参数（过滤非法值）
    private int getValidAssistParam() {
        // 默认取第一个有效参数，可根据实际需求修改逻辑（如随机选择）
        for (int param : validAimAssistParams) {
            if (isParamValid(param)) {
                return param;
            }
        }
        // 理论上不会触发（validAimAssistParams已预设合法值），此处为兜底
        return validAimAssistParams[0];
    }

    // 辅助方法：校验参数是否在配置的有效范围内（1、3、5）
    private boolean isParamValid(int param) {
        for (int validParam : validAimAssistParams) {
            if (param == validParam) {
                return true;
            }
        }
        return false;
    }

    // 辅助瞄准结果封装类：存储目标部位、使用参数、头部瞄准概率
    public static class AimAssistResult {
        private final AimTargetPart targetPart;
        private final int usedParam;
        private final int headAimProb;

        public AimAssistResult(AimTargetPart targetPart, int usedParam, int headAimProb) {
            this.targetPart = targetPart;
            this.usedParam = usedParam;
            this.headAimProb = headAimProb;
        }

        // Getter方法：供外部获取结果数据
        public String getTargetPartName() {
            return targetPart.getPartName();
        }

        public int getUsedParam() {
            return usedParam;
        }

        public int getHeadAimProb() {
            return headAimProb;
        }

        // 重写toString：便于调试时打印清晰结果
        @Override
        public String toString() {
            return "GROZA辅助瞄准结果：" +
                    "瞄准部位=" + targetPart.getPartName() +
                    ", 启用辅助参数=" + usedParam +
                    ", 头部首次瞄准概率=" + headAimProb + "%";
        }
    }

    // 测试入口：验证辅助瞄准功能逻辑
    public static void main(String[] args) {
        // 示例1：用户选择目标Key为"B"（对应头部）
        GROZAAssaultRifleAimAssist grozaAim1 = new GROZAAssaultRifleAimAssist("B");
        AimAssistResult result1 = grozaAim1.runAimAssist();
        System.out.println(result1);

        // 示例2：用户选择目标Key为"D"（对应身体，虽选身体但头部概率100%，最终仍瞄准头部）
        GROZAAssaultRifleAimAssist grozaAim2 = new GROZAAssaultRifleAimAssist("D");
        AimAssistResult result2 = grozaAim2.runAimAssist();
        System.out.println(result2);
    }
}
