"""
VentraIP DNS Configuration — Staged Execution
===============================================
Uses Playwright persistent context for stateful browser sessions.

Stages:
  python3 ventraip_staged.py login          # Login + trigger 2FA
  python3 ventraip_staged.py verify CODE    # Enter 2FA code
  python3 ventraip_staged.py explore        # Explore DNS UI structure
  python3 ventraip_staged.py configure      # Configure all 38 domains
  python3 ventraip_staged.py configure --domain sydneychatbots.com.au  # Single domain
"""

import json
import os
import re
import sys
import time
from pathlib import Path
from playwright.sync_api import sync_playwright

VENTRAIP_LOGIN_URL = "https://vip.ventraip.com.au/login/"
VENTRAIP_EMAIL = "kinan@protonmail.com"
VENTRAIP_PASSWORD = "9iphQKcIv0#2J0Ce"
NETLIFY_A_RECORD = "75.2.60.5"

MANIFEST_PATH = "/mnt/e/genesis-system/scripts/gold_pipeline/output/deployment_manifest.json"
BROWSER_STATE_DIR = "/mnt/e/genesis-system/scripts/gold_pipeline/output/.ventraip_browser_state"
SCREENSHOT_DIR = Path("/mnt/e/genesis-system/scripts/gold_pipeline/output/ventraip_screenshots")
OUTPUT_DIR = Path("/mnt/e/genesis-system/scripts/gold_pipeline/output")

SCREENSHOT_DIR.mkdir(parents=True, exist_ok=True)

# VentraIP domains (Tiers 4-9)
VENTRAIP_DOMAINS = [
    "sydneychatbots.com.au", "brisbanechatbots.com.au", "melbournechatbots.com.au",
    "adelaidechatbots.com.au", "cairnschatbots.com.au", "sunshinecoastchatbots.com.au",
    "townsvillechatbots.com.au", "darwinchatbots.com.au", "aichatbotsbrisbane.au",
    "aichatbotsaustralia.au",
    "tradiechatbots.com.au", "tradiechatbot.com.au", "tradiesvoice.com.au",
    "tradieautomation.com.au", "aitradie.au", "sparkybots.com.au", "plumberbots.com.au",
    "hvacbots.com.au", "electricianbotai.au", "solarbotai.au", "mechanicbot.au",
    "locksmithbot.au", "rooferbot.au",
    "receptionistai.au", "beautybot.com.au", "propertybotai.com.au", "propertybotai.au",
    "dentalbotai.au", "clinicaibot.au", "lawyerbot.au", "legalbotai.au", "rentbot.au",
    "voiceassistant.com.au", "voiceassistant.au", "aivoicereceptionist.au",
    "phonebot.au", "talkbot.au", "bookingbot.au",
]


def get_domain_map():
    with open(MANIFEST_PATH) as f:
        manifest = json.load(f)
    result = {}
    for domain in VENTRAIP_DOMAINS:
        if domain in manifest:
            match = re.search(r"https://([^.]+)\.netlify\.app", manifest[domain])
            if match:
                result[domain] = match.group(1)
    return result


def create_browser(pw):
    """Create a persistent browser context."""
    os.makedirs(BROWSER_STATE_DIR, exist_ok=True)
    context = pw.chromium.launch_persistent_context(
        BROWSER_STATE_DIR,
        headless=True,
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        viewport={"width": 1920, "height": 1080},
        args=["--no-sandbox", "--disable-blink-features=AutomationControlled"],
    )
    return context


def stage_login():
    """Stage 1: Login to VentraIP (triggers 2FA email)."""
    print("[STAGE: LOGIN]")
    with sync_playwright() as pw:
        context = create_browser(pw)
        page = context.pages[0] if context.pages else context.new_page()

        print("  Navigating to VIPcontrol...")
        page.goto(VENTRAIP_LOGIN_URL, timeout=60000)
        page.wait_for_load_state("networkidle", timeout=30000)

        # Fill credentials
        page.fill('input[name="email"], input[type="email"]', VENTRAIP_EMAIL)
        page.fill('input[name="password"], input[type="password"]', VENTRAIP_PASSWORD)
        page.screenshot(path=str(SCREENSHOT_DIR / "stage1_filled.png"))

        # Click login
        login_btn = page.query_selector('button:has-text("Login")') or page.query_selector('button[type="submit"]')
        if login_btn:
            login_btn.click()
        else:
            page.keyboard.press("Enter")

        page.wait_for_timeout(5000)
        page.wait_for_load_state("networkidle", timeout=30000)
        page.screenshot(path=str(SCREENSHOT_DIR / "stage1_result.png"))

        url = page.url
        content = page.content()
        print(f"  URL: {url}")

        if "two-factor" in content.lower() or "authentication code" in content.lower() or "verify" in content.lower():
            print("  2FA PAGE DETECTED — check kinan@protonmail.com for the code")
            print("  Run: python3 ventraip_staged.py verify <CODE>")
        elif "dashboard" in url.lower() or "login" not in url.lower():
            print("  Already logged in! Run: python3 ventraip_staged.py explore")
        else:
            print(f"  Unexpected state. Check screenshots.")

        context.close()


def stage_verify(code: str):
    """Stage 2: Enter 2FA code."""
    print(f"[STAGE: VERIFY] Code: {code}")
    with sync_playwright() as pw:
        context = create_browser(pw)
        page = context.pages[0] if context.pages else context.new_page()

        # Navigate to VIPcontrol (persistent context should still have session)
        page.goto("https://vip.ventraip.com.au/", timeout=60000)
        page.wait_for_load_state("networkidle", timeout=30000)
        page.wait_for_timeout(2000)
        page.screenshot(path=str(SCREENSHOT_DIR / "stage2_before.png"))

        url = page.url
        content = page.content()
        print(f"  URL: {url}")

        # Check if we're on the 2FA page
        if "two-factor" in content.lower() or "authentication code" in content.lower() or "verify" in content.lower():
            # Find the code input
            code_input = (
                page.query_selector('input[name*="code"]')
                or page.query_selector('input[name*="token"]')
                or page.query_selector('input[name*="otp"]')
                or page.query_selector('input[placeholder*="Code"]')
                or page.query_selector('input[placeholder*="Authentication"]')
                or page.query_selector('input[type="text"]')
                or page.query_selector('input[type="number"]')
            )

            if code_input:
                code_input.fill(code)
                page.screenshot(path=str(SCREENSHOT_DIR / "stage2_code_filled.png"))

                # Click verify button
                verify_btn = (
                    page.query_selector('button:has-text("Verify")')
                    or page.query_selector('button:has-text("Login")')
                    or page.query_selector('button:has-text("Submit")')
                    or page.query_selector('button[type="submit"]')
                )
                if verify_btn:
                    verify_btn.click()
                else:
                    page.keyboard.press("Enter")

                page.wait_for_timeout(5000)
                page.wait_for_load_state("networkidle", timeout=30000)
                page.screenshot(path=str(SCREENSHOT_DIR / "stage2_result.png"))

                url = page.url
                print(f"  URL after verify: {url}")

                if "login" not in url.lower() or "dashboard" in url.lower() or "domain" in url.lower():
                    print("  LOGIN SUCCESSFUL! Session saved.")
                    print("  Run: python3 ventraip_staged.py explore")
                else:
                    print("  Verify may have failed. Check stage2_result.png")
            else:
                print("  Could not find code input field")
                # Dump all inputs for debugging
                inputs = page.query_selector_all("input")
                for inp in inputs:
                    name = inp.get_attribute("name") or ""
                    type_ = inp.get_attribute("type") or ""
                    placeholder = inp.get_attribute("placeholder") or ""
                    print(f"    input: name={name} type={type_} placeholder={placeholder}")
        elif "login" in url.lower():
            print("  Session expired. Re-run: python3 ventraip_staged.py login")
        else:
            print("  Already logged in! Run: python3 ventraip_staged.py explore")

        context.close()


def stage_explore():
    """Stage 3: Explore DNS interface."""
    print("[STAGE: EXPLORE]")
    domain_map = get_domain_map()
    first_domain = list(domain_map.keys())[0]

    with sync_playwright() as pw:
        context = create_browser(pw)
        page = context.pages[0] if context.pages else context.new_page()

        # Check if logged in
        page.goto("https://vip.ventraip.com.au/", timeout=60000)
        page.wait_for_load_state("networkidle", timeout=30000)
        page.wait_for_timeout(2000)
        url = page.url
        print(f"  Dashboard URL: {url}")
        page.screenshot(path=str(SCREENSHOT_DIR / "stage3_dashboard.png"))

        if "login" in url.lower():
            print("  Not logged in! Run: python3 ventraip_staged.py login")
            context.close()
            return

        # Try to navigate to domains list
        print("  Checking domains page...")
        page.goto("https://vip.ventraip.com.au/domains", timeout=30000)
        page.wait_for_load_state("networkidle", timeout=20000)
        page.wait_for_timeout(2000)
        page.screenshot(path=str(SCREENSHOT_DIR / "stage3_domains_list.png"))
        print(f"  Domains URL: {page.url}")

        # Try first domain DNS
        print(f"  Exploring DNS for: {first_domain}")
        for url_pattern in [
            f"https://vip.ventraip.com.au/domains/{first_domain}/dns",
            f"https://vip.ventraip.com.au/domain/{first_domain}/dns",
            f"https://vip.ventraip.com.au/domains/{first_domain}",
        ]:
            page.goto(url_pattern, timeout=30000)
            page.wait_for_load_state("networkidle", timeout=20000)
            page.wait_for_timeout(2000)
            current = page.url
            content = page.content()
            print(f"  Tried: {url_pattern}")
            print(f"  Landed: {current}")

            if "dns" in current.lower() or "DNS" in content or "record" in content.lower():
                page.screenshot(path=str(SCREENSHOT_DIR / f"stage3_dns_{first_domain.replace('.','_')}.png"))
                print("  DNS page found!")

                # Dump all form elements
                print("\n  === FORM ELEMENTS ===")
                for tag in ["input", "select", "button", "textarea"]:
                    elements = page.query_selector_all(tag)
                    for el in elements:
                        name = el.get_attribute("name") or ""
                        type_ = el.get_attribute("type") or ""
                        placeholder = el.get_attribute("placeholder") or ""
                        cls = el.get_attribute("class") or ""
                        text = ""
                        try:
                            text = el.inner_text()[:50]
                        except Exception:
                            pass
                        if name or type_ or placeholder or text:
                            print(f"    {tag}: name='{name}' type='{type_}' ph='{placeholder}' text='{text}' class='{cls[:50]}'")

                # Look for links with DNS-related text
                print("\n  === DNS-RELATED LINKS ===")
                links = page.query_selector_all("a")
                for link in links:
                    href = link.get_attribute("href") or ""
                    text = ""
                    try:
                        text = link.inner_text()[:60]
                    except Exception:
                        pass
                    if "dns" in href.lower() or "dns" in text.lower() or "record" in text.lower():
                        print(f"    <a href='{href}'>{text}</a>")

                break

        # Also capture the page HTML for analysis
        html_path = SCREENSHOT_DIR / f"stage3_dns_page_{first_domain.replace('.','_')}.html"
        html_path.write_text(page.content()[:50000], encoding="utf-8")
        print(f"\n  HTML saved: {html_path}")

        context.close()


def stage_configure(target_domain: str = None):
    """Stage 4: Configure DNS for all domains."""
    print("[STAGE: CONFIGURE]")
    domain_map = get_domain_map()

    if target_domain:
        if target_domain not in domain_map:
            print(f"  Domain {target_domain} not found")
            return
        domains = {target_domain: domain_map[target_domain]}
    else:
        domains = domain_map

    print(f"  Configuring {len(domains)} domains")

    results = []

    with sync_playwright() as pw:
        context = create_browser(pw)
        page = context.pages[0] if context.pages else context.new_page()

        # Check logged in
        page.goto("https://vip.ventraip.com.au/", timeout=60000)
        page.wait_for_load_state("networkidle", timeout=30000)
        if "login" in page.url.lower():
            print("  Not logged in! Run login + verify first.")
            context.close()
            return

        print("  Authenticated. Starting DNS configuration...\n")

        for i, (domain, netlify_sub) in enumerate(domains.items(), 1):
            netlify_target = f"{netlify_sub}.netlify.app"
            print(f"  [{i}/{len(domains)}] {domain} → {netlify_target}")

            result = {"domain": domain, "netlify": netlify_target, "status": "unknown", "a_record": False, "cname_record": False}

            try:
                # Navigate to domain DNS page
                dns_url = f"https://vip.ventraip.com.au/domains/{domain}/dns"
                page.goto(dns_url, timeout=30000)
                page.wait_for_load_state("networkidle", timeout=20000)
                page.wait_for_timeout(2000)

                current_url = page.url
                content = page.content()

                if "dns" not in current_url.lower() and "record" not in content.lower():
                    # Try alternative URL patterns
                    for alt in [
                        f"https://vip.ventraip.com.au/domain/{domain}/dns",
                        f"https://vip.ventraip.com.au/domains/{domain}",
                    ]:
                        page.goto(alt, timeout=30000)
                        page.wait_for_load_state("networkidle", timeout=20000)
                        page.wait_for_timeout(1000)
                        if "dns" in page.url.lower() or "record" in page.content().lower():
                            break

                page.screenshot(path=str(SCREENSHOT_DIR / f"config_{domain.replace('.','_')}.png"))

                # Check for existing DNS records
                content = page.content()

                # Look for "Add Record" or similar button
                add_btn = (
                    page.query_selector('button:has-text("Add Record")')
                    or page.query_selector('button:has-text("Add DNS")')
                    or page.query_selector('a:has-text("Add Record")')
                    or page.query_selector('button:has-text("Add")')
                    or page.query_selector('[data-action="add"]')
                )

                if add_btn:
                    # === ADD A RECORD ===
                    add_btn.click()
                    page.wait_for_timeout(1500)

                    # Select A record type
                    type_select = page.query_selector('select[name*="type"], select[name*="record"]')
                    if type_select:
                        type_select.select_option(label="A")
                        page.wait_for_timeout(500)

                    # Fill hostname (@)
                    name_input = page.query_selector('input[name*="name"], input[name*="host"], input[placeholder*="Name"], input[placeholder*="Host"]')
                    if name_input:
                        name_input.fill("@")

                    # Fill value
                    value_input = page.query_selector('input[name*="content"], input[name*="value"], input[name*="address"], input[name*="data"], input[placeholder*="Content"], input[placeholder*="Value"], input[placeholder*="Address"]')
                    if value_input:
                        value_input.fill(NETLIFY_A_RECORD)

                    page.screenshot(path=str(SCREENSHOT_DIR / f"config_a_{domain.replace('.','_')}.png"))

                    # Save
                    save_btn = (
                        page.query_selector('button:has-text("Save")')
                        or page.query_selector('button:has-text("Add")')
                        or page.query_selector('button:has-text("Create")')
                        or page.query_selector('button[type="submit"]')
                    )
                    if save_btn:
                        save_btn.click()
                        page.wait_for_timeout(2000)
                        result["a_record"] = True
                        print(f"    A record: @ → {NETLIFY_A_RECORD}")

                    # === ADD CNAME RECORD ===
                    page.wait_for_timeout(1000)
                    # Re-find add button (page may have refreshed)
                    add_btn2 = (
                        page.query_selector('button:has-text("Add Record")')
                        or page.query_selector('button:has-text("Add DNS")')
                        or page.query_selector('a:has-text("Add Record")')
                        or page.query_selector('button:has-text("Add")')
                    )
                    if add_btn2:
                        add_btn2.click()
                        page.wait_for_timeout(1500)

                    type_select2 = page.query_selector('select[name*="type"], select[name*="record"]')
                    if type_select2:
                        type_select2.select_option(label="CNAME")
                        page.wait_for_timeout(500)

                    name_input2 = page.query_selector('input[name*="name"], input[name*="host"], input[placeholder*="Name"], input[placeholder*="Host"]')
                    if name_input2:
                        name_input2.fill("www")

                    value_input2 = page.query_selector('input[name*="content"], input[name*="value"], input[name*="target"], input[name*="data"], input[placeholder*="Content"], input[placeholder*="Value"], input[placeholder*="Target"]')
                    if value_input2:
                        value_input2.fill(netlify_target)

                    page.screenshot(path=str(SCREENSHOT_DIR / f"config_cname_{domain.replace('.','_')}.png"))

                    save_btn2 = (
                        page.query_selector('button:has-text("Save")')
                        or page.query_selector('button:has-text("Add")')
                        or page.query_selector('button:has-text("Create")')
                        or page.query_selector('button[type="submit"]')
                    )
                    if save_btn2:
                        save_btn2.click()
                        page.wait_for_timeout(2000)
                        result["cname_record"] = True
                        print(f"    CNAME: www → {netlify_target}")

                    result["status"] = "configured" if (result["a_record"] and result["cname_record"]) else "partial"
                else:
                    print(f"    No 'Add Record' button found — checking page structure")
                    result["status"] = "no_add_button"
                    page.screenshot(path=str(SCREENSHOT_DIR / f"config_nobutton_{domain.replace('.','_')}.png"))

            except Exception as e:
                print(f"    ERROR: {e}")
                result["status"] = f"error: {str(e)[:100]}"
                try:
                    page.screenshot(path=str(SCREENSHOT_DIR / f"config_error_{domain.replace('.','_')}.png"))
                except Exception:
                    pass

            results.append(result)

            if i < len(domains):
                time.sleep(1.5)

        context.close()

    # Save results
    results_path = OUTPUT_DIR / "ventraip_dns_results.json"
    with open(results_path, "w") as f:
        json.dump(results, f, indent=2)

    # Summary
    configured = sum(1 for r in results if r["status"] == "configured")
    partial = sum(1 for r in results if r["status"] == "partial")
    failed = sum(1 for r in results if r["status"] not in ("configured", "partial"))

    print(f"\n  {'='*50}")
    print(f"  RESULTS: {configured} configured, {partial} partial, {failed} failed")
    print(f"  Results: {results_path}")
    print(f"  {'='*50}")


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage:")
        print("  python3 ventraip_staged.py login")
        print("  python3 ventraip_staged.py verify <CODE>")
        print("  python3 ventraip_staged.py explore")
        print("  python3 ventraip_staged.py configure [--domain DOMAIN]")
        sys.exit(1)

    cmd = sys.argv[1]

    if cmd == "login":
        stage_login()
    elif cmd == "verify":
        if len(sys.argv) < 3:
            print("Usage: python3 ventraip_staged.py verify <2FA_CODE>")
            sys.exit(1)
        stage_verify(sys.argv[2])
    elif cmd == "explore":
        stage_explore()
    elif cmd == "configure":
        target = None
        if "--domain" in sys.argv:
            idx = sys.argv.index("--domain")
            if idx + 1 < len(sys.argv):
                target = sys.argv[idx + 1]
        stage_configure(target)
    else:
        print(f"Unknown command: {cmd}")
        sys.exit(1)
