"""
AutoPOE2 - Step 2: Activate Map 2 from Map Device and Enter Portal (Live Client)
Follows exact ground-truth coordinates:
- Map Device: (1054, 735)
- ENDGAME tab: (1563, 95)
- Next Reachable Node: auto-detect green node / click reachable
- TRAVERSE: (1093, 1044)
- Click Portal into Map 2
"""

import sys
import time
import ctypes
import os
from pathlib import Path
from PIL import Image

WORKSPACE_ROOT = str(Path(__file__).resolve().parent.parent)
sys.path.insert(0, WORKSPACE_ROOT)

from src.assistant_tool.screen_capturer import ScreenCapturer
from src.common.win32_window import find_poe2_window, ensure_window_focus
from src.assistant_tool.config import Config
from src.assistant_tool.log_watcher import LogWatcher

def log(msg):
    print(f"[Step2_Map2] {msg}", flush=True)

def find_green_reachable_node(img_path):
    """Quét tìm tọa độ node màu xanh lá cây khả dụng trên Atlas."""
    if not os.path.exists(img_path):
        return 1470, 1068
    try:
        img = Image.open(img_path).convert("RGB")
        w, h = img.size
        # Quét vùng Atlas tree
        green_pts = []
        for y in range(int(h * 0.15), int(h * 0.85), 3):
            for x in range(int(w * 0.2), int(w * 0.8), 3):
                r, g, b = img.getpixel((x, y))
                if g > 160 and g > r + 40 and g > b + 30:
                    green_pts.append((x, y))
        if green_pts:
            clusters = []
            for pt in green_pts:
                matched = False
                for c in clusters:
                    if abs(pt[0] - c[0][0]) < 35 and abs(pt[1] - c[0][1]) < 35:
                        c.append(pt)
                        matched = True
                        break
                if not matched:
                    clusters.append([pt])
            valid = [c for c in clusters if len(c) >= 10]
            if valid:
                best = max(valid, key=len)
                cx = sum(p[0] for p in best) // len(best)
                cy = sum(p[1] for p in best) // len(best)
                return cx, cy
    except Exception as e:
        log(f"Error scanning green node: {e}")
    return 1470, 1068

def main():
    capturer = ScreenCapturer(output_dir="captures")
    hwnd = find_poe2_window()
    if not hwnd:
        log("ERROR: Could not find POE2 window!")
        return False

    ensure_window_focus(hwnd)
    time.sleep(0.3)

    user32 = ctypes.windll.user32
    VK_SPACE = 0x20
    VK_F = 0x46
    VK_U = 0x55
    KEYEVENTF_KEYUP = 0x0002

    def click(x, y, delay=0.4):
        user32.SetCursorPos(int(x), int(y))
        time.sleep(0.12)
        user32.mouse_event(0x0002, 0, 0, 0, 0)
        time.sleep(0.08)
        user32.mouse_event(0x0004, 0, 0, 0, 0)
        time.sleep(delay)

    def press_key(vk, scan=0, delay=0.3):
        user32.keybd_event(vk, scan, 0, 0)
        time.sleep(0.06)
        user32.keybd_event(vk, scan, KEYEVENTF_KEYUP, 0)
        time.sleep(delay)

    log_path = Config.find_poe2_client_log()
    lw = LogWatcher(log_path) if log_path else None
    baseline_zone = lw.seed_latest_playable_zone().area_name if lw and lw.seed_latest_playable_zone() else "Shoreline Hideout"
    log(f"Baseline zone in Hideout: '{baseline_zone}'")

    # 1. Tiếp cận và click mở Map Device tại (1054, 735)
    log("1. Clicking Map Device at (1054, 735)...")
    click(1054, 735, delay=0.5)
    press_key(VK_F, 0x21, delay=1.5)

    # Dự phòng: nếu UI chưa mở, nhấn phím 'U'
    p1 = capturer.capture_screenshot(event_name="STEP2_MAP_DEVICE_CLICKED", capture_ram=False)
    log(f"Map device view captured: {p1}")

    # 2. Mở tab ENDGAME tại (1563, 95)
    log("2. Clicking ENDGAME tab at (1563, 95)...")
    click(1563, 95, delay=3.0)

    p_atlas = capturer.capture_screenshot(event_name="STEP2_ATLAS_LOADED", capture_ram=False)
    log(f"Atlas tree loaded: {p_atlas}")

    # 3. Chọn Node tiếp theo
    node_x, node_y = find_green_reachable_node(p_atlas)
    log(f"3. Selecting Atlas Node at ({node_x}, {node_y})...")
    click(node_x, node_y, delay=1.2)

    p_node = capturer.capture_screenshot(event_name="STEP2_NODE_SELECTED", capture_ram=False)
    log(f"Node selected: {p_node}")

    # 4. Bấm nút TRAVERSE tại (1093, 1044)
    log("4. Clicking TRAVERSE at (1093, 1044)...")
    click(1093, 1044, delay=4.0)

    p_traverse = capturer.capture_screenshot(event_name="STEP2_AFTER_TRAVERSE", capture_ram=False)
    log(f"After traverse click: {p_traverse}")

    # 5. Đóng modal còn vướng (phím Space) và bước vào Portal
    log("5. Dismissing modals (Space) and locating portal...")
    press_key(VK_SPACE, 0x39, delay=0.6)

    # Click portal khu vực Map Device tại (1054, 600) và (1046, 402)
    log("6. Clicking Portal into Map 2...")
    click(1054, 600, delay=0.3)
    click(1046, 402, delay=0.3)
    press_key(VK_F, 0x21, delay=0.5)

    # 7. Chờ chuyển cảnh vào Map 2
    log("7. Waiting for zone transition into Map 2...")
    entered = False
    new_zone = ""
    for i in range(30):  # Chờ tối đa 15s
        time.sleep(0.5)
        if i in (6, 12, 18):
            log(f"Retry interacting with portal (attempt {i//6})...")
            click(1054, 600, delay=0.2)
            click(1046, 402, delay=0.2)
            press_key(VK_F, 0x21, delay=0.3)
        if lw:
            s = lw.seed_latest_playable_zone()
            cur = s.area_name if s else ""
            if cur and "hideout" not in cur.lower() and cur != baseline_zone:
                log(f"SUCCESS: Successfully entered Map 2! New zone: '{cur}'")
                entered = True
                new_zone = cur
                break

    p_final = capturer.capture_screenshot(event_name="STEP2_MAP2_ENTERED_RESULT", capture_ram=False)
    log(f"Final screenshot: {p_final}")
    return entered, new_zone

if __name__ == "__main__":
    success, zone = main()
    sys.exit(0 if success else 1)
