#!/usr/bin/env python3
"""v11: Open Process 7 → select step → edit → find SQL field → modify → Run."""
import asyncio, json
from playwright.async_api import async_playwright

IP = "66.175.238.112"
APP = "2610RTROGERSUAP1"
BASE = f"http://{IP}/{APP}"
SQL_QUERY = "SELECT @@version AS version, DB_NAME() AS db, GETDATE() AS now"

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        context = await browser.new_context(viewport={"width":1920,"height":1080})
        page = await context.new_page()

        ajax = []
        async def on_req(req):
            if "/api/" in req.url or "/integration" in req.url.lower():
                ajax.append({"m":req.method,"u":req.url.split(APP)[-1][:120],"d":req.post_data[:500] if req.post_data else None})
        page.on("request", on_req)

        # Login
        for attempt in range(3):
            await page.goto(f"{BASE}/login", wait_until="domcontentloaded", timeout=15000)
            await asyncio.sleep(2)
            await page.fill('input[name="Email"]', 'irelyadmin')
            await page.fill('input[name="Password"]', 'i21By2015')
            await page.evaluate('''() => { const c = document.querySelector('input[name="Company"]'); if (c) c.value = '01'; }''')
            await asyncio.sleep(1)
            await page.evaluate('document.querySelector("form").submit()')
            await asyncio.sleep(12)
            try: await page.wait_for_load_state("networkidle", timeout=15000)
            except: pass
            if "login" not in page.url.lower() or "#home" in page.url: break
        else:
            print("Login failed"); await browser.close(); return
        print("✅ Login OK")

        # Open Process 7 directly via URL
        await page.goto(f"{BASE}/#/IP/ProcessSetup?action=edit&filters%5B0%5D%5Bcolumn%5D=intProcessId&filters%5B0%5D%5Bvalue%5D=7%7C%5E%7C&activeTab=&totalRecords=8&recordWindowId=&searchTab=Process&menuId=810&moduleMenuId=806",
                        wait_until="networkidle", timeout=20000)
        await asyncio.sleep(8)
        print(f"Process editor: {page.url}")
        
        # Verify process editor loaded
        header = await page.evaluate("document.querySelector('#processsetup-1204_header-title-textEl')?.textContent")
        print(f"  Header: {header}")
        
        # Find step grid rows
        grid_rows = await page.evaluate('''() => {
            const items = [];
            document.querySelectorAll('.x-grid-row, .x-grid-data-row, .x-grid-table-row, tr.x-grid-row').forEach(row => {
                const t = row.textContent.trim();
                if (t.length > 5 && t.length < 200) {
                    items.push({text: t.substring(0, 80), id: row.id || ''});
                }
            });
            return items;
        }''')
        print(f"\nGrid rows: {len(grid_rows)}")
        for r in grid_rows[:5]:
            print(f"  #{r['id']} {r['text'][:60]}")
        
        # Select the first step row (AP Account step)
        if grid_rows:
            row_id = grid_rows[0]["id"]
            print(f"\nSelecting step row: #{row_id}")
            
            # Click to select
            await page.evaluate(f"document.getElementById('{row_id}')?.click()")
            await asyncio.sleep(2)
            
            # Double-click to open step editor
            await page.evaluate(f'''(rowId) => {{
                const row = document.getElementById(rowId);
                if (row) {{
                    row.dispatchEvent(new MouseEvent('dblclick', {{bubbles: true, cancelable: true}}));
                }}
            }}''', row_id)
            await asyncio.sleep(5)
            try: await page.wait_for_load_state("networkidle", timeout=10000)
            except: pass
        
        # Also try the "Edit" button
        edit_btn = await page.query_selector('#button-1345')  # or button-1092
        if not edit_btn:
            edit_btn = await page.query_selector('#button-1092')
        if edit_btn:
            is_visible = await edit_btn.is_visible()
            print(f"Edit button visible: {is_visible}")
            if is_visible:
                await edit_btn.click(timeout=5000)
                await asyncio.sleep(5)
        
        # Check what appeared — step editor form
        print(f"\n=== After step select+edit ===")
        await page.screenshot(path="/tmp/step_editor.png")
        
        # Get ALL form fields
        form = await page.evaluate('''() => {
            const fields = [];
            document.querySelectorAll('input, textarea, select').forEach(el => {
                fields.push({
                    tag: el.tagName, id: el.id||'', name: el.name||'',
                    type: el.type||'', value: (el.value||'').substring(0,80),
                    visible: el.offsetParent !== null,
                    cls: (el.className||'').substring(0,40)
                });
            });
            return fields;
        }''')
        print(f"Form fields ({len(form)}):")
        for f in form[:25]:
            vis = "✅" if f["visible"] else "❌"
            print(f"  {vis} {f['tag']} id={f['id']} type={f['type']} val={f['value'][:50]} cls={f['cls'][:30]}")
        
        # Find SQL-related fields
        sql_fields = [f for f in form if f["visible"] and (
            "sql" in f["id"].lower() or "sql" in f["name"].lower() or "sql" in f["cls"].lower() or
            f["value"] and "sql" in f["value"].lower() or
            f["value"] and "usp" in f["value"].lower())]
        print(f"\nSQL fields ({len(sql_fields)}):")
        for f in sql_fields:
            print(f"  ✅ {f['tag']} id={f['id']} val={f['value'][:60]}")
        
        # Find ALL visible text — look for SQL/Execute labels
        visible = await page.evaluate('''() => {
            const items = [];
            document.querySelectorAll('*').forEach(el => {
                if (el.children.length === 0 && el.textContent && el.offsetParent !== null) {
                    const t = el.textContent.trim();
                    if (t.length > 1 && t.length < 80) {
                        items.push({text: t, id: el.id||''});
                    }
                }
            });
            return items;
        }''')
        sql_labels = [m for m in visible if any(k in m["text"].lower() for k in
            ["sql", "execute", "query", "command", "external", "program", "database",
             "send mail", "ftp", "file", "import", "export", "transform", "copy",
             "move", "delete", "connection", "server", "type"])]
        print(f"\nSQL/Execute labels ({len(sql_labels)}):")
        for m in sql_labels[:15]:
            print(f"  #{m['id']} '{m['text'][:50]}'")
        
        # Find combos (step type selector)
        combo_ids = [f["id"] for f in form if f["visible"] and ("combo" in f["id"].lower() or "combo" in f["cls"].lower())]
        print(f"\nCombos to expand: {combo_ids}")
        for cid in combo_ids[:5]:
            try:
                el = await page.query_selector(f"#{cid}")
                if el:
                    await el.click(timeout=5000)
                    await asyncio.sleep(2)
                    options = await page.evaluate('''() => {
                        const items = [];
                        document.querySelectorAll('.x-boundlist-item').forEach(el => {
                            if (el.offsetParent !== null) items.push(el.textContent.trim());
                        });
                        return items;
                    }''')
                    print(f"  {cid}: {options[:15]}")
                    await page.keyboard.press("Escape")
                    await asyncio.sleep(1)
            except: pass
        
        # Find textareas (SQL command field is often a textarea)
        textareas = [f for f in form if f["tag"] == "TEXTAREA" and f["visible"]]
        print(f"\nVisible textareas ({len(textareas)}):")
        for ta in textareas:
            print(f"  id={ta['id']} val={ta['value'][:60]}")
            # If this textarea contains SQL, it's our target
            if ta["value"] and ("usp" in ta["value"] or "select" in ta["value"].lower() or "sql" in ta["value"].lower()):
                print(f"    🎯 THIS IS THE SQL FIELD!")
                # Fill with our SQL
                el = await page.query_selector(f"#{ta['id']}")
                if el:
                    await el.fill(SQL_QUERY)
                    print(f"    Filled with: {SQL_QUERY[:50]}")
                    
                    # Save
                    save_btn = await page.query_selector('#button-1343')  # Save in process editor
                    if save_btn:
                        await save_btn.click(timeout=5000)
                        await asyncio.sleep(3)
                        print(f"    Saved!")
                    
                    # Run Selected Step
                    run_btn = await page.query_selector('#button-1346')
                    if run_btn:
                        await run_btn.click(timeout=5000)
                        await asyncio.sleep(10)
                        print(f"    Run clicked!")
                        await page.screenshot(path="/tmp/after_run.png")
        
        # AJAX
        print(f"\n=== AJAX ({len(ajax)}) ===")
        for c in ajax[-20:]:
            print(f"  {c['m']} {c['u']}")
            if c['d']:
                print(f"    data: {c['d'][:200]}")
        
        await browser.close()

asyncio.run(main())
