#!/usr/bin/env python3
import sys
import os
import time
import random
from selenium import webdriver

class ScrollController:
    def __init__(self, debug_port: int):
        options = webdriver.ChromeOptions()
        options.add_experimental_option("debuggerAddress", f"127.0.0.1:{debug_port}")
        self.driver = webdriver.Chrome(options=options)
        
        # Load JavaScript files
        js_dir = os.path.join(os.path.dirname(__file__), "..", "js")
        self.js_code = ""
        with open(os.path.join(js_dir, "viewport.js")) as f:
            self.js_code = f.read()

    def get_viewport_info(self) -> dict:
        return self.driver.execute_script(self.js_code + "; return getViewportInfo();")

    def smooth_scroll(self, target_x: int, target_y: int):
        viewport = self.get_viewport_info()
        start_x = viewport['scroll_x']
        start_y = viewport['scroll_y']
        
        # Clamp target values to valid ranges
        target_x = max(0, min(target_x, viewport['max_scroll_x']))
        target_y = max(0, min(target_y, viewport['max_scroll_y']))
        
        # Calculate number of steps (random for natural feel)
        steps = random.randint(5, 10)
        
        for step in range(1, steps + 1):
            progress = step / steps
            current_x = start_x + (target_x - start_x) * progress
            current_y = start_y + (target_y - start_y) * progress
            
            self.driver.execute_script(
                'window.scrollTo(arguments[0], arguments[1]);', 
                current_x, current_y
            )
            
            # Random small delay between steps
            time.sleep(random.uniform(0.01, 0.05))
        
        # Final position check
        final = self.get_viewport_info()
        return {
            'x': final['scroll_x'],
            'y': final['scroll_y']
        }

def main(debug_port: int, target_x: int, target_y: int):
    try:
        controller = ScrollController(debug_port)
        result = controller.smooth_scroll(target_x, target_y)
        print(result)
    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(1)

if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Usage: itb_scroll <debug_port> <x> <y>")
        sys.exit(1)
    
    main(int(sys.argv[1]), int(sys.argv[2]), int(sys.argv[3]))
