import os

import pytest
from playwright.sync_api import expect

RESULT_TIMEOUT_MS = 15000


def _wait_for_login_complete(page, timeout_ms: int = RESULT_TIMEOUT_MS) -> None:
    wait_js = """
        () => {
          const path = window.location.pathname || '';
          if (path.includes('/login')) return false;
          const token = localStorage.getItem('Token');
          const auth = localStorage.getItem('Authorization');
          return Boolean((token && token.length) || (auth && auth.length));
        }
        """
    page.wait_for_function(wait_js, timeout=timeout_ms)


def ensure_authed(
    page,
    login_url: str,
    active_auth_context,
    auth_click,
    seeded_user_credentials=None,
    timeout_ms: int = RESULT_TIMEOUT_MS,
) -> None:
    if seeded_user_credentials:
        email, password = seeded_user_credentials
    else:
        email = os.getenv("SEEDED_USER_EMAIL") or os.getenv("E2E_ADMIN_EMAIL")
        password = os.getenv("SEEDED_USER_PASSWORD") or os.getenv("E2E_ADMIN_PASSWORD")
    if not email or not password:
        pytest.skip("SEEDED_USER_EMAIL/SEEDED_USER_PASSWORD not set.")

    token_wait_js = """
        () => {
          const token = localStorage.getItem('Token');
          const auth = localStorage.getItem('Authorization');
          return Boolean((token && token.length) || (auth && auth.length));
        }
        """

    try:
        if "/login" not in page.url:
            page.wait_for_function(token_wait_js, timeout=2000)
            return
    except Exception:
        pass

    page.goto(login_url, wait_until="domcontentloaded")

    if "/login" not in page.url:
        return

    form, _ = active_auth_context()
    email_input = form.locator("input[data-testid='auth-email'], [data-testid='auth-email'] input")
    password_input = form.locator("input[data-testid='auth-password'], [data-testid='auth-password'] input")
    expect(email_input).to_have_count(1)
    expect(password_input).to_have_count(1)
    email_input.fill(email)
    password_input.fill(password)
    password_input.blur()

    submit_button = form.locator("button[data-testid='auth-submit'], [data-testid='auth-submit'] button, [data-testid='auth-submit']")
    expect(submit_button).to_have_count(1)
    auth_click(submit_button, "submit_login")

    _wait_for_login_complete(page, timeout_ms=timeout_ms)
    expect(page.locator("form[data-testid='auth-form'][data-active='true']")).to_have_count(0, timeout=timeout_ms)
