"""smurfmarkt.online/upgrade.php form filler."""
import time
from typing import Any, Dict

import abort
from config import Config
from utils.fill import (
    click_by_text,
    fill_instant,
    type_into,
    wait_for_selector,
)
from utils.logger import child

log = child("smurfmarkt")

UPGRADE_URL = "https://smurfmarkt.online/upgrade.php"


def run(sb, params: Dict[str, Any], cfg: Config) -> Dict[str, Any]:
    upgrade_key = params["upgrade_key"]
    email = params["email"]
    password = params["password"]
    country = params.get("country") or "US"

    log.info(f"smurfmarkt: opening {UPGRADE_URL}")
    sb.open(UPGRADE_URL)
    time.sleep(2.0)

    key_sel = wait_for_selector(sb.driver, ["#upgradeKey", 'input[name="upgradeKey"]'], timeout_s=10)
    if not key_sel:
        return {"ok": False, "error": "upgrade key field not found"}
    # Per-char type → blur triggers smurfmarkt's validator
    type_into(sb.driver, key_sel, upgrade_key, per_char_delay_ms=40)
    log.info("upgrade key typed")
    time.sleep(1.5)
    abort.check()

    email_sel = wait_for_selector(sb.driver, ["#spotifyLogin", 'input[name="spotifyLogin"]'], timeout_s=8)
    if email_sel:
        type_into(sb.driver, email_sel, email, per_char_delay_ms=25)
    pw_sel = wait_for_selector(sb.driver, ["#spotifyPassword", 'input[name="spotifyPassword"]'], timeout_s=5)
    if pw_sel:
        type_into(sb.driver, pw_sel, password, per_char_delay_ms=25)
    country_sel = wait_for_selector(sb.driver, ["#country", 'select[name="country"]'], timeout_s=3)
    if country_sel:
        fill_instant(sb.driver, country_sel, country)

    time.sleep(0.8)
    clicked = False
    for sel in (
        'button[type="submit"]',
        'input[type="submit"]',
    ):
        try:
            ok = sb.driver.execute_script(
                "const b=document.querySelector(arguments[0]); if(b && !b.disabled){ b.click(); return true; } return false;",
                sel,
            )
            if ok:
                clicked = True
                break
        except Exception:
            pass
    if not clicked:
        clicked = click_by_text(sb.driver, "Upgrade") or click_by_text(sb.driver, "Submit")
    if not clicked:
        return {"ok": False, "error": "submit button not found"}

    time.sleep(4.0)
    return {"ok": True}


def run_standalone(sb_factory, params: Dict[str, Any], cfg: Config) -> Dict[str, Any]:
    with sb_factory() as sb:
        abort.register_sb(sb)
        try:
            return run(sb, params, cfg)
        finally:
            abort.clear_sb()
