"""
Exchange search — POST types keyword, GET reads team results.
"""
from playwright.async_api import Page, Locator

from app.automation.helpers import human_delay
from app.automation.selectors import (
    SEARCH_HEADER_TEXT,
    SEARCH_INPUT,
    SEARCH_LOADER,
    SEARCH_TEAMS_LIST,
)
from app.automation.tasks.exchange import _scroll_until_stable, open_exchange
from app.automation.tasks.popup import close_hudl_popups
from app.automation.team_parser import parse_team_li

# Remember last search on this browser session (for GET right after POST)
_last_search_query: str | None = None


async def _ensure_exchange_page(page: Page) -> None:
    if "exchange" not in page.url.lower():
        await open_exchange(page)
    else:
        await close_hudl_popups(page)
        await human_delay(0.5, 1)


async def _wait_for_loader_done(page: Page, timeout_ms: int = 30000) -> None:
    loader = page.locator(SEARCH_LOADER)
    if await loader.count() > 0:
        try:
            await loader.first.wait_for(state="hidden", timeout=timeout_ms)
        except Exception:
            pass
    await human_delay(1, 2)


async def run_search(page: Page, query: str) -> dict:
    """
    POST: type in search box → wait loader → read header text.
    """
    global _last_search_query

    await _ensure_exchange_page(page)

    search_input = page.locator(SEARCH_INPUT).first
    await search_input.wait_for(state="visible", timeout=20000)
    await search_input.click()
    await search_input.fill("")
    await search_input.fill(query)
    await human_delay(0.3, 0.6)
    await search_input.press("Enter")

    await _wait_for_loader_done(page)

    header_text = ""
    header = page.locator(SEARCH_HEADER_TEXT).first
    if await header.count() > 0:
        header_text = (await header.inner_text()).strip()

    _last_search_query = query

    return {
        "status": "ok",
        "action": "search",
        "query": query,
        "header_text": header_text,
        "url": page.url,
        "message": "Search done. Call GET /exchange/search/teams for team list.",
    }


async def get_search_teams(page: Page) -> dict:
    """
    GET: read all teams from //ul[@class="potential-teams"]/li (scroll if needed).
    Bypasses hard wait timeouts if search yields 0 results.
    """
    await _ensure_exchange_page(page)
    await close_hudl_popups(page)

    teams_locator = page.locator(SEARCH_TEAMS_LIST)
    await _wait_for_loader_done(page)

    # Soft wait for search results to attach (non-blocking fallback for 0 results query)
    try:
        await teams_locator.first.wait_for(state="attached", timeout=5000)
    except Exception:
        pass

    await _scroll_until_stable(page, teams_locator)

    teams = []
    for i in range(await teams_locator.count()):
        row = await parse_team_li(teams_locator.nth(i), i)
        if row:
            teams.append(row)

    return {
        "status": "ok",
        "action": "search_teams",
        "query": _last_search_query,
        "url": page.url,
        "suggested_teams": teams,
        "suggested_teams_count": len(teams),
    }

