# apps/aroflo_connector_app/ui_automation_zones/zones/timesheets/commands/nav.py
from __future__ import annotations

import sys
from playwright.sync_api import Page

from ....core.artifacts import create_run_dir, shot
from ....core.runtime import SESSION_POOL, MFARequired, open_one_shot
from ....auth.session import ensure_logged_in
from ..flows import nav as flow_nav


def cmd_timesheets_nav(cfg, *, mfa_code: str = "") -> int:
    run_dir = create_run_dir(cfg, "timesheets-nav")
    tenant_id = cfg.tenant_id or "<default>"

    # Permitimos MFA solo si el operador lo habilita (mfa_code o pause_on_mfa).
    try:
        interactive = sys.stdin.isatty()
    except Exception:
        interactive = False
    allow_mfa = (
        bool(mfa_code.strip())
        or bool(getattr(cfg, "pause_on_mfa", False))
        or interactive
    )

    # Modo persistente (pool)
    if cfg.reuse_session:
        lock = SESSION_POOL.tenant_lock(tenant_id)
        with lock:
            try:
                rt = SESSION_POOL.get(
                    cfg=cfg,
                    tenant_id=tenant_id,
                    run_dir=run_dir,
                    mfa_code=mfa_code,
                    allow_mfa=allow_mfa,
                )
            except MFARequired:
                # Caso controlado: MFA requerido pero no permitido (o faltó el código)
                shot(rt.page, run_dir, "mfa-required") if "rt" in locals() else None
                raise SystemExit(
                    "MFA_REQUIRED: AroFlo pidió MFA. Reintenta con --pause-on-mfa para ingresarlo "
                    "por consola, o pásalo directo con --mfa-code 123456."
                )

            page: Page = rt.page

            try:
                # Ya estamos logueados por SessionPool.get()
                flow_nav.run(page, cfg, run_dir)
                shot(page, run_dir, "ok")
                rt.save_state()
                rt.touch()
            except Exception:
                shot(page, run_dir, "99-error")
                raise
            finally:
                if not cfg.keep_open:
                    SESSION_POOL.close(tenant_id)

        return 0

    # One-shot (sin pool)
    rt = open_one_shot(cfg)
    page = rt.page
    try:
        ensure_logged_in(page, cfg, run_dir, mfa_code=mfa_code, allow_mfa=allow_mfa)
        flow_nav.run(page, cfg, run_dir)
        shot(page, run_dir, "ok")
        rt.save_state()
    except Exception:
        shot(page, run_dir, "99-error")
        raise
    finally:
        rt.close()

    return 0
