#!/usr/bin/env python3
"""
REAL Gemini Deep Think Workflow - v4
Key discoveries from v3:
- Gemini accessible without Google auth (shows Fast/Thinking/Pro modes)
- Mode picker selector: button[aria-label="Open mode picker"]
- Modes available: Fast, Thinking, Pro (NOT "Deep Think" literally)
- "Thinking" = standard thinking, "Pro" = deep think (long form)
- Input selector: div[aria-label="Enter a prompt for Gemini"]
- Response selector: model-response

This version: selects "Pro" mode (maximum thinking) then sends prompt
"""

import os
import sys
import time
import json
from datetime import datetime
from playwright.sync_api import sync_playwright, TimeoutError as PlaywrightTimeoutError

SCREENSHOTS_DIR = "/mnt/e/genesis-system/deep_think_results/screenshots"
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)
    step_log.append(line)

def screenshot(page, name):
    path = f"{SCREENSHOTS_DIR}/{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():
    log("=" * 60)
    log("GEMINI DEEP THINK v4 - SELECT THINKING/PRO MODE")
    log(f"Started: {datetime.now().isoformat()}")
    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",
        "mode_selected": None,
        "response_text": "",
        "workflow_steps": [],
        "screenshots": [],
        "errors": [],
    }

    with sync_playwright() as p:

        # Launch Chromium (headless=False required for full JS)
        log("\n[STEP 1] Launching browser...")
        browser = p.chromium.launch(
            headless=False,
            slow_mo=200,
            args=[
                "--disable-blink-features=AutomationControlled",
                "--start-maximized",
            ]
        )
        page = browser.new_page(viewport={"width": 1440, "height": 900})

        try:
            # ---- 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(5)
            screenshot(page, "01_loaded")

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

            workflow_steps.append({
                "step": 2,
                "action": "Navigate",
                "url": "https://gemini.google.com",
                "wait": "5 seconds after domcontentloaded",
            })

            # ---- Click mode picker (currently shows "Fast") ----
            log("\n[STEP 3] Opening mode picker...")

            # The mode picker button has aria-label="Open mode picker"
            mode_picker = page.locator('[aria-label="Open mode picker"]')
            if mode_picker.count() == 0:
                log("[WARN] Mode picker not found, trying text-based selector")
                mode_picker = page.locator('button:has-text("Fast")')

            if mode_picker.count() > 0:
                log(f"[OK] Mode picker found, current text: '{mode_picker.text_content()}'")
                screenshot(page, "02_before_mode_click")

                mode_picker.click()
                time.sleep(2)
                screenshot(page, "03_mode_dropdown_open")
                log("Mode picker dropdown opened")

                workflow_steps.append({
                    "step": 3,
                    "action": "Open mode picker",
                    "selector": '[aria-label="Open mode picker"]',
                    "code": 'page.locator(\'[aria-label="Open mode picker"]\').click()',
                    "note": "This opens a dropdown with Fast / Thinking / Pro modes"
                })

                # Get all visible elements to find mode options
                all_elements = page.evaluate("""
                    () => {
                        const els = document.querySelectorAll('li, [role="menuitem"], [role="option"], [role="listitem"]');
                        const result = [];
                        for (const el of els) {
                            const rect = el.getBoundingClientRect();
                            if (rect.width > 0 && rect.height > 0) {
                                result.push({
                                    tag: el.tagName,
                                    text: el.textContent?.trim()?.substring(0, 100),
                                    aria: el.getAttribute('aria-label'),
                                    role: el.getAttribute('role'),
                                    class: el.className?.toString()?.substring(0, 60),
                                    x: Math.round(rect.x),
                                    y: Math.round(rect.y),
                                });
                            }
                        }
                        return result;
                    }
                """)

                log(f"Dropdown elements found: {len(all_elements)}")
                for el in all_elements:
                    log(f"  [{el['tag']}] text='{el.get('text','')}' role='{el.get('role','')}' y={el.get('y')}")

                # Target selectors for mode options (discovered from v3)
                # v3 found: "Fast  Answers quickly", "Thinking  Solves complex problems", "Pro  Thinks longer for advanced math & code"

                # Try to select "Pro" mode (deepest thinking)
                pro_selectors = [
                    'li:has-text("Pro")',
                    '[role="menuitem"]:has-text("Pro")',
                    '[role="option"]:has-text("Pro")',
                    'button:has-text("Pro")',
                    'div:has-text("Pro  Thinks longer")',
                ]

                thinking_selectors = [
                    'li:has-text("Thinking")',
                    '[role="menuitem"]:has-text("Thinking")',
                    '[role="option"]:has-text("Thinking")',
                ]

                mode_selected = False

                # Try Pro first (deepest thinking = "Deep Think")
                for sel in pro_selectors:
                    try:
                        el = page.locator(sel).first
                        if el.count() > 0 and el.is_visible():
                            log(f"[OK] Found Pro mode via: {sel}")
                            log(f"  Text: '{el.text_content()[:60]}'")
                            el.click()
                            time.sleep(2)
                            screenshot(page, "04_pro_mode_selected")
                            result["mode_selected"] = "Pro (Deep Think)"
                            mode_selected = True
                            workflow_steps.append({
                                "step": 4,
                                "action": "Select Pro mode (Deep Think)",
                                "selector": sel,
                                "code": f'page.locator("{sel}").first.click()',
                                "note": "Pro = deepest thinking mode (equivalent to Deep Think)",
                            })
                            break
                    except Exception as e:
                        log(f"  Selector {sel} failed: {e}", "WARN")

                # Try clicking by position based on discovered y-coordinates
                if not mode_selected and all_elements:
                    pro_elements = [el for el in all_elements if 'pro' in (el.get('text') or '').lower()]
                    if pro_elements:
                        pro_el = pro_elements[0]
                        log(f"[OK] Clicking Pro by position: ({pro_el['x']}, {pro_el['y']})")
                        page.mouse.click(pro_el['x'] + 20, pro_el['y'] + 10)
                        time.sleep(2)
                        screenshot(page, "04_pro_clicked_by_pos")
                        result["mode_selected"] = "Pro (by position)"
                        mode_selected = True

                # Fallback to Thinking mode
                if not mode_selected:
                    for sel in thinking_selectors:
                        try:
                            el = page.locator(sel).first
                            if el.count() > 0 and el.is_visible():
                                log(f"[OK] Selecting Thinking mode via: {sel}")
                                el.click()
                                time.sleep(2)
                                screenshot(page, "04_thinking_mode_selected")
                                result["mode_selected"] = "Thinking"
                                mode_selected = True
                                break
                        except:
                            pass

                if not mode_selected:
                    log("[WARN] Could not select thinking mode - using Fast mode", "WARN")
                    page.keyboard.press("Escape")
                    result["mode_selected"] = "Fast (default)"

            else:
                log("[WARN] Mode picker button not found!", "WARN")
                result["mode_selected"] = "Unknown (mode picker not found)"

            # ---- Check mode is selected ----
            time.sleep(1)
            mode_btn_text = page.locator('[aria-label="Open mode picker"]').text_content() if \
                page.locator('[aria-label="Open mode picker"]').count() > 0 else "unknown"
            log(f"Current mode button: '{mode_btn_text}'")
            screenshot(page, "05_mode_confirmed")

            # ---- Enter prompt ----
            log(f"\n[STEP 5] Entering test prompt...")
            log(f"Prompt: {TEST_PROMPT}")

            # Use the aria-label selector discovered in v3
            input_el = page.locator('[aria-label="Enter a prompt for Gemini"]')
            if input_el.count() == 0:
                input_el = page.locator('div[contenteditable="true"]').first

            if input_el.count() > 0 and input_el.is_visible():
                log("[OK] Found chat input")
                input_el.click()
                time.sleep(0.5)
                # Type the prompt character by character
                page.keyboard.type(TEST_PROMPT, delay=15)
                time.sleep(1)
                screenshot(page, "06_prompt_entered")

                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] Chat input not found!", "ERROR")
                result["status"] = "no_input"
                result["errors"].append("Chat input not found")
                return result

            # ---- Submit prompt ----
            log("\n[STEP 6] Submitting prompt...")
            send_btn = page.locator('[aria-label="Send message"]')
            if send_btn.count() > 0 and send_btn.is_visible():
                send_btn.click()
                log("[OK] Clicked Send button")
                workflow_steps.append({
                    "step": 6,
                    "action": "Submit prompt",
                    "selector": '[aria-label="Send message"]',
                    "code": 'page.locator(\'[aria-label="Send message"]\').click()',
                })
            else:
                page.keyboard.press("Enter")
                log("[OK] Enter key to submit")

            time.sleep(4)
            screenshot(page, "07_submitted")

            # ---- Wait for response ----
            log(f"\n[STEP 7] Waiting for response (mode: {result['mode_selected']})...")
            log("Deep Think / Pro mode can take 60-120 seconds. Being patient...")

            # Check if thinking indicator appears
            time.sleep(5)
            screenshot(page, "08_thinking_start")

            # Check for "Thinking..." or similar indicator
            page_text_early = page.evaluate("() => document.body.innerText?.substring(0, 1000)")
            has_thinking_indicator = any(x in page_text_early.lower() for x in
                ['thinking', 'processing', 'generating'])
            log(f"Thinking indicator present: {has_thinking_indicator}")

            # Wait loop - 120 seconds total
            prev_content_hash = ""
            stable_rounds = 0
            response_text = ""

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

                # Extract current response text
                current = page.evaluate("""
                    () => {
                        // Try model-response first (confirmed working in v3)
                        const responses = document.querySelectorAll('model-response');
                        if (responses.length > 0) {
                            const last = responses[responses.length - 1];
                            return last.innerText?.substring(0, 10000) || '';
                        }
                        // Fallback
                        return document.body.innerText?.substring(0, 2000) || '';
                    }
                """) or ""

                # Check loading state
                is_generating = page.evaluate("""
                    () => {
                        // Check for various generating indicators
                        const indicators = [
                            document.querySelector('[aria-label*="Generating"]'),
                            document.querySelector('[aria-label*="Loading"]'),
                            document.querySelector('.generating'),
                            document.querySelector('[aria-busy="true"]'),
                            document.querySelector('[class*="loading"]'),
                            document.querySelector('[class*="spinner"]'),
                        ];
                        return indicators.some(el => el !== null);
                    }
                """)

                content_hash = hash(current[:200])
                if content_hash == prev_content_hash:
                    stable_rounds += 1
                else:
                    stable_rounds = 0
                    prev_content_hash = content_hash
                    response_text = current

                if elapsed % 15 == 0:  # Log every 15 seconds
                    log(f"  {elapsed}s: generating={is_generating}, stable={stable_rounds}, response_len={len(current)}")
                    screenshot(page, f"09_progress_{elapsed:03d}s")

                # Done when stable for 3 rounds (6 seconds) and not generating
                if stable_rounds >= 3 and not is_generating and elapsed > 20:
                    log(f"[OK] Response complete after ~{elapsed}s!")
                    response_text = current
                    break

                # Also check for response length > threshold (real response)
                if len(current) > 200 and not is_generating and elapsed > 30:
                    log(f"[OK] Response ready ({len(current)} chars) after {elapsed}s")
                    response_text = current
                    break

            screenshot(page, "10_response_complete")

            # ---- Extract full response ----
            log("\n[STEP 8] Extracting full response...")

            full_response = page.evaluate("""
                () => {
                    const responses = document.querySelectorAll('model-response');
                    if (responses.length > 0) {
                        const last = responses[responses.length - 1];
                        return last.innerText || last.textContent || '';
                    }
                    // Fallback to main content
                    const main = document.querySelector('main, [role="main"]');
                    return (main || document.body).innerText?.substring(0, 15000) || '';
                }
            """) or response_text

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

            log(f"Response length: {len(full_response)} chars")
            log(f"\nRESPONSE PREVIEW:\n{full_response[:600]}\n...")

            workflow_steps.append({
                "step": 8,
                "action": "Extract response",
                "selector": "model-response",
                "code": 'response = page.locator("model-response").last.inner_text()',
                "result_length": len(full_response),
            })

        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, "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))

    with open("/mnt/e/genesis-system/deep_think_results/v4_results.json", 'w') as f:
        json.dump(result, f, indent=2, default=str)

    log(f"Results saved: v4_results.json")
    return result


if __name__ == "__main__":
    result = run()
    print(f"\n{'='*60}")
    print(f"STATUS: {result.get('status')}")
    print(f"MODE: {result.get('mode_selected')}")
    print(f"Screenshots: {len(result.get('screenshots', []))}")
    if result.get('response_text'):
        print(f"\nFULL RESPONSE:\n{result['response_text']}")
