#!/usr/bin/env python3
"""
REAL Gemini Deep Think Workflow - Windows Native
Runs on Windows Python with real Chrome profile for authenticated access.

This script is designed to run via Windows PowerShell:
python E:\genesis-system\scripts\deep_think_windows.py

Key differences from WSL version:
- Uses Windows paths (backslash)
- Can launch real Chrome executable
- Has access to Windows DPAPI for cookie decryption
- Chrome + Playwright can communicate natively
"""

import os
import sys
import time
import json
from datetime import datetime

# Windows paths
CHROME_EXE = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
CHROME_USER_DATA = r"C:\Users\P3\AppData\Local\Google\Chrome\User Data"
SCREENSHOTS_DIR = r"E:\genesis-system\deep_think_results\screenshots"
RESULTS_DIR = r"E:\genesis-system\deep_think_results"

os.makedirs(SCREENSHOTS_DIR, exist_ok=True)

step_log = []
workflow_steps = []

def log(msg, level="INFO"):
    ts = datetime.now().strftime("%H:%M:%S")
    line = f"[{ts}] [{level}] {msg}"
    print(line, flush=True)
    step_log.append(line)

def screenshot(page, name):
    path = os.path.join(SCREENSHOTS_DIR, f"{name}.png")
    try:
        page.screenshot(path=path, full_page=False)
        log(f"Screenshot: {name}")
    except Exception as e:
        log(f"Screenshot failed '{name}': {e}", "WARN")
    return path


def run():
    from playwright.sync_api import sync_playwright, TimeoutError as PlaywrightTimeoutError

    log("=" * 60)
    log("GEMINI DEEP THINK - WINDOWS NATIVE")
    log(f"Started: {datetime.now().isoformat()}")
    log(f"Chrome: {CHROME_EXE}")
    log(f"Profile: {CHROME_USER_DATA}")
    log("=" * 60)

    TEST_PROMPT = "What is the single most important strategic decision for a new AI voice widget product targeting Australian digital agencies in 2026?"

    result = {
        "status": "unknown",
        "logged_in": False,
        "mode_selected": None,
        "deep_think_found": False,
        "response_text": "",
        "workflow_steps": [],
        "screenshots": [],
        "errors": [],
    }

    with sync_playwright() as p:

        # Launch Chrome with real user profile
        log("\n[STEP 1] Launching Chrome with real Windows profile...")
        try:
            browser = p.chromium.launch_persistent_context(
                user_data_dir=CHROME_USER_DATA,
                executable_path=CHROME_EXE,
                headless=False,
                slow_mo=300,
                args=[
                    "--profile-directory=Default",
                    "--no-first-run",
                    "--no-default-browser-check",
                    "--disable-component-update",
                    "--disable-extensions-except=",  # disable extensions to avoid conflicts
                ],
                viewport={"width": 1440, "height": 900},
                ignore_default_args=["--enable-automation"],  # avoid detection
            )
            log("[OK] Chrome launched with real profile!")
            workflow_steps.append({
                "step": 1,
                "action": "Launch Chrome with real profile",
                "code": f'p.chromium.launch_persistent_context(user_data_dir=r"{CHROME_USER_DATA}", executable_path=r"{CHROME_EXE}", headless=False)',
                "note": "Must run on Windows Python, not WSL"
            })

        except Exception as e:
            log(f"[ERROR] Chrome launch failed: {e}", "ERROR")
            result["errors"].append(f"Chrome launch: {e}")
            log("[FALLBACK] Trying plain Chromium...")
            browser_obj = p.chromium.launch(headless=False, slow_mo=200)
            browser = browser_obj
            workflow_steps.append({
                "step": 1,
                "action": "Launch Chromium (fallback - no profile)",
            })

        # Get page
        if hasattr(browser, 'pages') and browser.pages:
            page = browser.pages[0]
        else:
            page = browser.new_page()

        try:
            # ---- STEP 2: Navigate to Gemini ----
            log("\n[STEP 2] Navigating to gemini.google.com...")
            page.goto("https://gemini.google.com", timeout=45000, wait_until="domcontentloaded")
            time.sleep(6)
            screenshot(page, "WIN_01_loaded")

            log(f"URL: {page.url}")
            log(f"Title: {page.title()}")

            # ---- STEP 3: Check login state ----
            log("\n[STEP 3] Checking login state...")

            elements = page.evaluate("""
                () => {
                    const els = document.querySelectorAll('button, [role="button"], a, [aria-label]');
                    return Array.from(els)
                        .filter(el => {
                            const rect = el.getBoundingClientRect();
                            return rect.width > 0 && rect.height > 0;
                        })
                        .map(el => ({
                            tag: el.tagName,
                            text: el.textContent?.trim()?.substring(0, 60),
                            aria: el.getAttribute('aria-label') || '',
                        }));
                }
            """)

            log(f"Visible elements: {len(elements)}")
            for el in elements[:25]:
                if el.get('text') or el.get('aria'):
                    log(f"  [{el['tag']}] '{el.get('text','')}' / '{el.get('aria','')}'")

            # Detect login
            has_signin = any('sign in' in (el.get('text') or '').lower() for el in elements)
            has_mode_picker = any('mode picker' in (el.get('aria') or '').lower() for el in elements)
            has_account = any(
                any(x in (el.get('aria') or '').lower() for x in ['account', 'profile', 'google account'])
                for el in elements
            )

            log(f"Sign in visible: {has_signin}")
            log(f"Mode picker visible: {has_mode_picker}")
            log(f"Account element visible: {has_account}")

            is_logged_in = has_account or (not has_signin and has_mode_picker)
            result["logged_in"] = is_logged_in
            log(f"LOGIN STATE: {'LOGGED IN' if is_logged_in else 'NOT LOGGED IN'}")

            screenshot(page, "WIN_02_login_state")

            if not is_logged_in:
                log("[WARN] Not logged in! Taking screenshot for documentation.", "WARN")
                result["status"] = "needs_login"
                result["message"] = "Chrome profile cookies not accessible - need manual login"

            # ---- STEP 4: Open mode picker ----
            log("\n[STEP 4] Opening mode picker...")

            mode_picker = page.locator('[aria-label="Open mode picker"]')
            if mode_picker.count() > 0:
                log(f"Mode picker found: '{mode_picker.text_content()}'")
                mode_picker.click()
                time.sleep(2)
                screenshot(page, "WIN_03_mode_dropdown")

                # Get all elements in the dropdown
                dropdown_items = page.evaluate("""
                    () => {
                        const els = document.querySelectorAll(
                            '[role="menuitem"], [role="option"], [role="menuitemradio"], li'
                        );
                        return Array.from(els)
                            .filter(el => {
                                const rect = el.getBoundingClientRect();
                                return rect.width > 0 && rect.height > 0;
                            })
                            .map(el => ({
                                tag: el.tagName,
                                text: el.textContent?.trim()?.substring(0, 100),
                                aria: el.getAttribute('aria-label'),
                                role: el.getAttribute('role'),
                                disabled: el.getAttribute('aria-disabled'),
                                'data-mode-id': el.getAttribute('data-mode-id'),
                                'data-test-id': el.getAttribute('data-test-id'),
                                x: Math.round(el.getBoundingClientRect().x),
                                y: Math.round(el.getBoundingClientRect().y),
                            }));
                    }
                """)

                log(f"Dropdown items: {len(dropdown_items)}")
                for item in dropdown_items:
                    if item.get('text'):
                        log(f"  [{item['tag']}] '{item.get('text','')}' disabled={item.get('disabled')} mode-id={item.get('data-mode-id','')}")

                # Save dropdown analysis
                with open(os.path.join(RESULTS_DIR, "dropdown_analysis.json"), 'w') as f:
                    json.dump(dropdown_items, f, indent=2)

                # Filter available (non-disabled) modes
                available_modes = [item for item in dropdown_items
                                   if item.get('text') and item.get('disabled') != 'true']

                log(f"\nAvailable (non-disabled) modes:")
                for m in available_modes:
                    log(f"  - '{m.get('text','')}'")

                # Check for Deep Think modes
                deep_think_available = [m for m in available_modes
                                        if any(x in (m.get('text') or '').lower()
                                               for x in ['deep think', 'thinking', 'pro'])]

                if deep_think_available:
                    target = deep_think_available[0]
                    log(f"[OK] Selecting: '{target.get('text')}'")

                    # Click by position
                    page.mouse.click(target['x'] + 20, target['y'] + 10)
                    time.sleep(2)
                    screenshot(page, "WIN_04_mode_selected")
                    result["mode_selected"] = target.get('text', 'Unknown')
                    result["deep_think_found"] = True

                    workflow_steps.append({
                        "step": 4,
                        "action": "Select thinking mode",
                        "mode": target.get('text'),
                        "code": f'page.mouse.click({target["x"] + 20}, {target["y"] + 10})',
                        "alternative": 'page.locator(\'[data-test-id="bard-mode-option-thinking"]\').click()',
                    })
                else:
                    log("[INFO] No deep think modes available (may need subscription)")
                    page.keyboard.press("Escape")
                    result["mode_selected"] = "Fast (default)"

            # ---- STEP 5: Enter prompt ----
            log(f"\n[STEP 5] Entering prompt...")

            input_el = page.locator('[aria-label="Enter a prompt for Gemini"]').first
            if input_el.count() == 0:
                input_el = page.locator('div[contenteditable="true"]').first

            if input_el.count() > 0:
                input_el.click()
                time.sleep(0.5)
                page.keyboard.type(TEST_PROMPT, delay=15)
                time.sleep(1)
                screenshot(page, "WIN_05_prompt_entered")
                log(f"Prompt entered: '{TEST_PROMPT[:50]}...'")

                workflow_steps.append({
                    "step": 5,
                    "action": "Enter prompt",
                    "selector": '[aria-label="Enter a prompt for Gemini"]',
                    "code": 'page.locator(\'[aria-label="Enter a prompt for Gemini"]\').click(); page.keyboard.type(prompt)',
                })
            else:
                log("[ERROR] Could not find input!", "ERROR")
                result["status"] = "no_input"
                return result

            # Submit
            send_btn = page.locator('[aria-label="Send message"]')
            if send_btn.count() > 0:
                send_btn.click()
                log("Submitted via Send button")
            else:
                page.keyboard.press("Enter")
                log("Submitted via Enter")

            workflow_steps.append({
                "step": 6,
                "action": "Submit prompt",
                "selector": '[aria-label="Send message"]',
                "code": 'page.locator(\'[aria-label="Send message"]\').click()',
            })

            time.sleep(4)
            screenshot(page, "WIN_06_submitted")

            # ---- STEP 6: Wait for response ----
            log(f"\n[STEP 6] Waiting for response (mode: {result.get('mode_selected', 'unknown')})...")
            log("Deep Think can take 60-120 seconds...")

            # Check for thinking block (appears before response in Deep Think)
            time.sleep(5)
            thinking_block = page.locator('[class*="thinking"], [aria-label*="thinking"], .thought-block').count()
            log(f"Thinking block visible: {thinking_block > 0}")
            screenshot(page, "WIN_07_thinking_start")

            # Wait loop
            prev_len = 0
            stable_count = 0
            full_response = ""

            for i in range(60):
                time.sleep(2)
                elapsed = (i + 1) * 2

                current_response = page.evaluate("""
                    () => {
                        const responses = document.querySelectorAll('model-response');
                        if (responses.length > 0) {
                            return responses[responses.length - 1].innerText || '';
                        }
                        return '';
                    }
                """) or ""

                is_generating = page.evaluate("""
                    () => !!document.querySelector('[aria-busy="true"], .generating, [class*="loading"]')
                """)

                if len(current_response) == prev_len:
                    stable_count += 1
                else:
                    stable_count = 0
                    prev_len = len(current_response)
                    full_response = current_response

                if elapsed % 10 == 0:
                    log(f"  {elapsed}s: response_len={len(current_response)}, generating={is_generating}, stable={stable_count}")

                if stable_count >= 4 and not is_generating and elapsed > 20 and len(current_response) > 100:
                    log(f"[OK] Response complete after {elapsed}s!")
                    full_response = current_response
                    break

                if i == 59:
                    log("[WARN] Timeout reached, using what we have")
                    full_response = current_response

            screenshot(page, "WIN_08_response_complete")
            result["response_text"] = full_response
            result["status"] = "success" if len(full_response) > 100 else "partial"

            log(f"\nResponse length: {len(full_response)} chars")
            log(f"Preview: {full_response[:400]}")

        except Exception as e:
            log(f"[ERROR] {e}", "ERROR")
            import traceback
            traceback.print_exc()
            result["errors"].append(str(e))
            result["status"] = "error"
            try:
                screenshot(page, "WIN_ERROR")
            except:
                pass

        finally:
            log("Closing browser...")
            browser.close()

    # Save results
    result["workflow_steps"] = workflow_steps
    result["step_log"] = step_log
    result["screenshots"] = sorted(os.listdir(SCREENSHOTS_DIR))

    results_path = os.path.join(RESULTS_DIR, "windows_results.json")
    with open(results_path, 'w') as f:
        json.dump(result, f, indent=2, default=str)

    log(f"Results saved: {results_path}")
    return result


if __name__ == "__main__":
    result = run()
    print(f"\n{'='*60}")
    print(f"STATUS: {result.get('status')}")
    print(f"LOGGED IN: {result.get('logged_in')}")
    print(f"MODE: {result.get('mode_selected')}")
    print(f"DEEP THINK: {result.get('deep_think_found')}")
    if result.get('response_text'):
        print(f"\nFULL RESPONSE:\n{result['response_text']}")
