"""
VentraIP DNS Config — Live Session (waits for 2FA code via file)
================================================================
Keeps browser session alive. Code is passed via a file.

Usage:
    python3 ventraip_live.py                    # Login + wait for code + explore
    python3 ventraip_live.py --configure        # Login + wait for code + configure all
    python3 ventraip_live.py --configure --domain X  # Single domain
"""

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

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"
SCREENSHOT_DIR = Path("/mnt/e/genesis-system/scripts/gold_pipeline/output/ventraip_screenshots")
OUTPUT_DIR = Path("/mnt/e/genesis-system/scripts/gold_pipeline/output")
CODE_FILE = OUTPUT_DIR / "ventraip_2fa_code.txt"

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

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 wait_for_code(timeout_secs=300) -> str:
    """Poll CODE_FILE for the 2FA code."""
    # Remove any stale code file
    if CODE_FILE.exists():
        CODE_FILE.unlink()

    print(f"WAITING_FOR_CODE:{CODE_FILE}")
    sys.stdout.flush()

    start = time.time()
    while time.time() - start < timeout_secs:
        if CODE_FILE.exists():
            code = CODE_FILE.read_text().strip()
            if code:
                CODE_FILE.unlink()
                return code
        time.sleep(0.5)

    return ""


def configure_domain(page, domain: str, netlify_sub: str) -> dict:
    netlify_target = f"{netlify_sub}.netlify.app"
    result = {"domain": domain, "netlify": netlify_target, "status": "unknown", "a_record": False, "cname_record": False}

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

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

    # Try alternative URLs if needed
    if "dns" not in url.lower() and "record" not in content.lower():
        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_timeout(2000)
            if "dns" in page.url.lower() or "record" in page.content().lower():
                break

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

    # Find Add Record 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")')
    )

    if not add_btn:
        result["status"] = "no_add_button"
        return result

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

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

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

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

    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

    # ADD CNAME RECORD
    page.wait_for_timeout(1000)
    add_btn2 = page.query_selector('button:has-text("Add Record")') 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_sel2 = page.query_selector('select[name*="type"], select[name*="record"]')
    if type_sel2:
        type_sel2.select_option(label="CNAME")
        page.wait_for_timeout(500)

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

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

    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

    result["status"] = "configured" if (result["a_record"] and result["cname_record"]) else "partial"
    return result


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--configure", action="store_true")
    parser.add_argument("--domain", help="Single domain")
    parser.add_argument("--code", help="Pre-provide 2FA code (skip file polling)")
    args = parser.parse_args()

    domain_map = get_domain_map()

    with sync_playwright() as pw:
        browser = pw.chromium.launch(
            headless=True,
            args=["--no-sandbox", "--disable-blink-features=AutomationControlled"],
        )
        context = browser.new_context(
            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},
        )
        page = context.new_page()

        # === LOGIN ===
        print("[LOGIN] Navigating to VIPcontrol...")
        page.goto("https://vip.ventraip.com.au/login/", timeout=60000)
        page.wait_for_timeout(3000)

        page.fill('input[name="email"], input[type="email"]', VENTRAIP_EMAIL)
        page.fill('input[name="password"], input[type="password"]', VENTRAIP_PASSWORD)

        btn = page.query_selector('button:has-text("Login")') or page.query_selector('button[type="submit"]')
        if btn:
            btn.click()

        print("[LOGIN] Waiting for 2FA page...")
        page.wait_for_timeout(5000)

        content = page.content()
        if "two-factor" in content.lower() or "authentication" in content.lower():
            print("[2FA] Code required. Check kinan@protonmail.com")

            if args.code:
                code = args.code
            else:
                code = wait_for_code(timeout_secs=300)

            if not code:
                print("[2FA] No code received within timeout")
                browser.close()
                return

            print(f"[2FA] Entering code: {code}")

            code_input = (
                page.query_selector('input[placeholder*="Authentication"]')
                or page.query_selector('input[placeholder*="Code"]')
                or page.query_selector('input[name*="code"]')
                or page.query_selector('input[name*="token"]')
            )
            if not code_input:
                inputs = page.query_selector_all('input[type="text"], input[type="number"], input:not([type])')
                for inp in inputs:
                    if inp.is_visible():
                        code_input = inp
                        break

            if code_input:
                code_input.fill(code)
                verify_btn = (
                    page.query_selector('button:has-text("Verify")')
                    or page.query_selector('button:has-text("Login")')
                    or page.query_selector('button[type="submit"]')
                )
                if verify_btn:
                    verify_btn.click()

                # Wait for page transition - don't use networkidle, just wait
                page.wait_for_timeout(8000)
                page.screenshot(path=str(SCREENSHOT_DIR / "after_2fa.png"))

                url = page.url
                print(f"[2FA] URL after verify: {url}")

                if "incorrect" in page.content().lower():
                    print("[2FA] FAILED: Incorrect code")
                    browser.close()
                    return

                if "login" in url.lower() and "dashboard" not in url.lower():
                    print("[2FA] May have failed. Check after_2fa.png")
                    browser.close()
                    return

                print("[2FA] LOGIN SUCCESSFUL!")
            else:
                print("[2FA] Could not find code input")
                browser.close()
                return

        elif "login" not in page.url.lower():
            print("[LOGIN] Already authenticated!")
        else:
            print("[LOGIN] Unexpected state")
            page.screenshot(path=str(SCREENSHOT_DIR / "login_unexpected.png"))
            browser.close()
            return

        # === AUTHENTICATED — NOW WORK ===
        if args.configure or args.domain:
            if args.domain:
                if args.domain not in domain_map:
                    print(f"Domain {args.domain} not in manifest")
                    browser.close()
                    return
                domains = {args.domain: domain_map[args.domain]}
            else:
                domains = domain_map

            print(f"\n{'='*60}")
            print(f"CONFIGURING DNS — {len(domains)} domains")
            print(f"{'='*60}\n")

            results = []
            for i, (domain, netlify_sub) in enumerate(domains.items(), 1):
                print(f"[{i}/{len(domains)}] {domain}")
                result = configure_domain(page, domain, netlify_sub)
                results.append(result)
                print(f"  → {result['status']} | A={result['a_record']} CNAME={result['cname_record']}")
                if i < len(domains):
                    time.sleep(1.5)

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

            configured = sum(1 for r in results if r["status"] == "configured")
            partial = sum(1 for r in results if r["status"] == "partial")
            failed = len(results) - configured - partial
            print(f"\n{'='*60}")
            print(f"DONE: {configured} configured, {partial} partial, {failed} failed")
            print(f"{'='*60}")
        else:
            # Explore
            first = list(domain_map.keys())[0]
            print(f"\n[EXPLORE] Navigating to DNS for {first}...")

            for url_pattern in [
                f"https://vip.ventraip.com.au/domains/{first}/dns",
                f"https://vip.ventraip.com.au/domain/{first}/dns",
                f"https://vip.ventraip.com.au/domains/{first}",
                "https://vip.ventraip.com.au/domains",
            ]:
                page.goto(url_pattern, timeout=30000)
                page.wait_for_timeout(3000)
                page.screenshot(path=str(SCREENSHOT_DIR / f"explore_{url_pattern.split('/')[-1].replace('.','_')}.png"))
                print(f"  {url_pattern} → {page.url}")

                content = page.content()
                if "dns" in page.url.lower() or "record" in content.lower():
                    print("  DNS page found!")

                    # Dump visible elements
                    for tag in ["button", "a", "select", "input"]:
                        els = page.query_selector_all(tag)
                        for el in els:
                            try:
                                if not el.is_visible():
                                    continue
                                name = el.get_attribute("name") or ""
                                text = el.inner_text()[:60] if tag in ("button", "a") else ""
                                ph = el.get_attribute("placeholder") or ""
                                href = el.get_attribute("href") or ""
                                type_ = el.get_attribute("type") or ""
                                if name or text or ph:
                                    print(f"    <{tag} name='{name}' type='{type_}' ph='{ph}' href='{href[:40]}'> {text}")
                            except Exception:
                                pass

                    html_path = SCREENSHOT_DIR / f"explore_{first.replace('.','_')}.html"
                    html_path.write_text(page.content()[:100000], encoding="utf-8")
                    print(f"  HTML: {html_path}")
                    break

        browser.close()


if __name__ == "__main__":
    main()
