# -*- coding: utf-8 -*-
"""诊断：A) 邮编提交3策略对比  B) 变体控件结构探测。UK only。"""
import re, time, json
from playwright.sync_api import sync_playwright

UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36"
URL = "https://www.amazon.co.uk/Auckly-Wireless-Electromagnetic-Automatic-Compatible/dp/B08GY1VLDK"
ZIP = "SW1A 1AA"

def glow(page):
    try:
        el = page.locator("#nav-global-location-popover-link").first
        return " ".join(el.inner_text(timeout=2000).split()) if el.count() else None
    except Exception:
        return None

def diag_variants(page):
    print("=== 变体控件探测 ===")
    for sel in ["#twister", "#twister_feature_div", "[id^='inline-twister']", "#variation_style_name",
                ".swatch-element", "#twister form li", "#twister li", "li[data-asin]", "li[data-dp-url]"]:
        try:
            loc = page.locator(sel)
            n = loc.count()
            if n:
                first = loc.first
                info = first.get_attribute("id") or first.get_attribute("data-asin") or " ".join(first.inner_text(timeout=1000).split())[:60]
                print(f"{sel}: count={n} first={info}")
        except Exception as e:
            print(f"{sel}: ERR")
    # twister 内部 HTML 概览
    try:
        tw = page.locator("#twister_feature_div").first
        if tw.count():
            h = tw.inner_html(timeout=2000)
            print("twister inner html 前600字符：")
            print(re.sub(r"\s+", " ", h)[:600])
    except Exception:
        pass

def strategy(page, name, apply_fn):
    print(f"--- 策略 {name} ---")
    page.goto(URL, wait_until="domcontentloaded", timeout=45000)
    time.sleep(2)
    print("初始 glow:", glow(page))
    try:
        page.click("#nav-global-location-popover-link", timeout=8000)
        page.wait_for_selector("#GLUXZipUpdateInput", state="visible", timeout=8000)
        time.sleep(0.8)
        val = page.locator("#GLUXZipUpdateInput").input_value()
        print("输入框初值:", repr(val))
        page.fill("#GLUXZipUpdateInput", ZIP)
        apply_fn(page)
        # 弹窗状态
        time.sleep(1)
        err = page.locator("#GLUXZipError")
        print("apply后1s 错误框可见:", err.first.is_visible() if err.count() else "无元素")
        # 不 reload，轮询 glow 12s（亚马逊常自动刷新）
        for i in range(6):
            time.sleep(2)
            g = glow(page)
            if "SW1A" in (g or "").replace(" ", "") or "London" in (g or ""):
                print(f"策略{name}: ✅ {i*2+3}s 后自动生效 ->", g)
                return True
        print(f"策略{name}: 自动未生效，reload...")
        page.reload(wait_until="domcontentloaded", timeout=45000)
        time.sleep(3)
        g = glow(page)
        ok = "SW1A" in (g or "").replace(" ", "") or "London" in (g or "")
        print(f"策略{name}: reload后 {'✅' if ok else '❌'} ->", g)
        return ok
    except Exception as e:
        print(f"策略{name}: 异常 {type(e).__name__}: {e}")
        return False

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True, args=["--no-sandbox", "--disable-dev-shm-usage"])
    ctx = browser.new_context(user_agent=UA, locale="en-GB", timezone_id="Europe/London",
                              viewport={"width": 1366, "height": 768})
    ctx.add_cookies([{"name": "i18n-prefs", "value": "GBP", "domain": ".amazon.co.uk", "path": "/"}])
    page = ctx.new_page()
    # 变体探测（先跑，避免邮编影响）
    page.goto(URL, wait_until="domcontentloaded", timeout=45000)
    time.sleep(2.5)
    diag_variants(page)
    print()
    r1 = strategy(page, "A_点按钮", lambda pg: pg.click("#GLUXZipUpdate", timeout=4000, force=True))
    print()
    r2 = strategy(page, "B_回车", lambda pg: pg.press("#GLUXZipUpdateInput", "Enter"))
    print()
    print("结果:", {"A_点按钮": r1, "B_回车": r2})
    browser.close()
