"""Navigate to Users (Manage -> Users) and optionally select a user by email."""
from __future__ import annotations

from pathlib import Path
from playwright.sync_api import Page

from ....auth.post_login import handle_terminate_sessions
from ....common.selectors import officesite as officesite_sel
from ....common.selectors import bu as bu_sel
from ....common.officesite import manage as manage_menu
from ....common.officesite import home as home_menu
from ....core.artifacts import shot
from ....core.log import log_step, pause
from .select_user import select_user_by_email

USERS_URL = "https://office.aroflo.com/ims/Site/Users/index.cfm?view=1&tid=IMS.MNG.USR"


def run(page: Page, cfg, run_dir: Path, *, select_user: bool = True) -> None:
    page.wait_for_function("() => location.href.includes('/ims/')", timeout=30_000)
    handle_terminate_sessions(page, run_dir)

    officesite_sel.ensure_officesite(page)

    shot(page, run_dir, "users-nav-01-officesite")
    log_step("users-nav-01-officesite", page)
    pause(cfg, "Users nav: officesite ready")

    # BU (si aplica)
    target_bu = (getattr(cfg, "timesheet_bu", "") or "").strip()
    if target_bu:
        # Forzar Home antes de seleccionar BU (dropdown suele estar en Home)
        home_menu.ensure_home(page)
        bu_sel.select_bu(page, cfg, run_dir, target_bu=target_bu, tag_prefix="users-bu")

    # Manage -> Users
    manage_menu.open_manage_menu(page)
    page.wait_for_timeout(350)

    shot(page, run_dir, "users-nav-02-manage-clicked")
    log_step("users-nav-02-manage-clicked", page)
    pause(cfg, "Users nav: manage clicked")

    try:
        manage_menu.click_manage_item(page, label="Users")
    except Exception:
        # fallback directo por URL
        page.goto(USERS_URL, wait_until="domcontentloaded")

    # Espera landing Users
    page.wait_for_function(
        """() => {
            const urlOk = location.href.toLowerCase().includes('/users/');
            const txt = document.body && document.body.innerText ? document.body.innerText : '';
            const txtOk = txt.includes('Users') || txt.includes('User');
            return urlOk || txtOk;
        }""",
        timeout=45_000,
    )

    shot(page, run_dir, "users-nav-03-users-ready")
    log_step("users-nav-03-users-ready", page)
    pause(cfg, "Users nav: ready")

    # Seleccionar usuario por email si se pasó
    email = (getattr(cfg, "user_email", "") or "").strip()
    if select_user and email:
        select_user_by_email(page, email, run_dir=run_dir)

    shot(page, run_dir, "users-nav-04-done")
    log_step("users-nav-04-done", page)
