import time
import random

class InputController:
    """
    Module gửi phím bấm và thao tác chuột mô phỏng hành vi người thật (Human-like delays).
    Sử dụng pydirectinput để gửi ScanCode trực tiếp cho game Direct3D.
    """
    def __init__(self, config: dict):
        self.config = config
        self.sim_cfg = config.get("actuator", {}).get("human_simulation", {})
        self.min_press = self.sim_cfg.get("min_press_duration_sec", 0.04)
        self.max_press = self.sim_cfg.get("max_press_duration_sec", 0.09)

    def press_key(self, key: str):
        """
        Bấm và giữ phím với khoảng thời gian ngẫu nhiên mô phỏng ngón tay người bấm.
        """
        try:
            import pydirectinput
            pydirectinput.keyDown(key)
            duration = random.uniform(self.min_press, self.max_press)
            time.sleep(duration)
            pydirectinput.keyUp(key)
            # Thêm độ trễ jitter giữa các lần bấm
            time.sleep(random.uniform(0.02, 0.05))
        except ImportError:
            print(f"[InputController - Mock] Pressing key: {key}")
            time.sleep(0.05)

    def use_hp_potion(self):
        key = self.config["actuator"]["keys"]["potion_hp"]
        print(f"[Action] HP Low! Bơm máu (Phím {key})")
        self.press_key(key)

    def select_target(self):
        key = self.config["actuator"]["keys"]["target_nearest"]
        print(f"[Action] Tìm mục tiêu mới (Phím {key})")
        self.press_key(key)

    def cast_combat_skill(self, skill_key: str):
        print(f"[Action] Xả chiêu: {skill_key}")
        self.press_key(skill_key)

    def loot(self):
        key = self.config["actuator"]["keys"]["loot"]
        self.press_key(key)
