# apps/aroflo_connector_app/ui_automation/flows/timesheet_select_user.py
from __future__ import annotations

from pathlib import Path
from typing import Optional

from playwright.sync_api import Page

from ..core.artifacts import shot
from ..core.log import log_step, pause


def _wait_user_applied(page: Page, target_value: str, timeout_ms: int = 25_000) -> None:
    page.wait_for_function(
        """(val) => {
            const sel = document.querySelector("select#user_id");
            if (!sel) return false;
            return sel.value === val;
        }""",
        arg=target_value,
        timeout=timeout_ms,
    )


def _resolve_user_value_by_name(page: Page, user_name: str) -> str:
    sel = page.locator("select#user_id").first
    opt = sel.locator("option").filter(has_text=user_name).first
    if opt.count() == 0:
        raise RuntimeError(f"No encontré el usuario '{user_name}' en el selector select#user_id.")
    val = opt.get_attribute("value")
    if not val:
        raise RuntimeError(f"El option del usuario '{user_name}' no tiene atributo value.")
    return val


def run(
    page: Page,
    cfg,
    run_dir: Path,
    *,
    user_id: str = "",
    user_name: str = "",
) -> None:
    """
    Selecciona el usuario en Timesheets (select#user_id) y espera a que se aplique.

    Prioridad:
      1) user_id (único, recomendado)
      2) user_name (fallback; puede ser ambiguo si hay duplicados)

    Nota: El <select> tiene onchange="form.submit()", por lo que select_option dispara submit y navegación/recarga.
    """
    user_id = (user_id or "").strip()
    user_name = (user_name or "").strip()

    if not user_id and not user_name:
        return

    sel = page.locator("select#user_id").first
    if sel.count() == 0:
        raise RuntimeError("No existe select#user_id en la vista de Timesheets.")

    label = user_id or user_name
    shot(page, run_dir, f"ts-user-01-before-{label}")
    log_step(f"ts-user-01-before-{label}", page)
    pause(cfg, f"Before selecting Timesheet user: {label}")

    # Resolver el value a seleccionar
    if user_id:
        target_value = user_id
    else:
        target_value = _resolve_user_value_by_name(page, user_name)

    # Seleccionar (dispara submit)
    sel.select_option(value=target_value)

    # Esperar que cargue y que el select refleje el value
    try:
        page.wait_for_load_state("domcontentloaded", timeout=20_000)
    except Exception:
        pass

    _wait_user_applied(page, target_value)

    shot(page, run_dir, f"ts-user-02-after-{label}")
    log_step(f"ts-user-02-after-{label}", page)
    pause(cfg, f"After selecting Timesheet user: {label}")
