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
from ..flows import select_date as flow_date
from ..flows import select_user as flow_user
from ..flows import delete as flow_delete
from ..flows.delete import DeleteRule


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

    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
    )

    delete_all = bool(getattr(cfg, "delete_all", False))
    include_protected = bool(getattr(cfg, "include_protected", False))

    rule = DeleteRule(
        overheads_to_delete=[
            "Admin Duties",
            "Admin Duties - Telecommunications",
        ],
        protected_overheads=[
            "Lunch Break - Unpaid",
        ],
        match_mode="exact",
        delete_all=delete_all,
        include_protected=include_protected,
    )

    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:
                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:
                flow_nav.run(page, cfg, run_dir)
                if cfg.timesheet_user_id or cfg.timesheet_user_name:
                    flow_user.run(
                        page,
                        cfg,
                        run_dir,
                        user_id=cfg.timesheet_user_id,
                        user_name=cfg.timesheet_user_name,
                    )
                if cfg.timesheet_date:
                    flow_date.run(page, cfg, run_dir, target_date=cfg.timesheet_date)
                flow_delete.run(page, cfg, run_dir, rule=rule)
                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

    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)
        if cfg.timesheet_user_id or cfg.timesheet_user_name:
            flow_user.run(
                page,
                cfg,
                run_dir,
                user_id=cfg.timesheet_user_id,
                user_name=cfg.timesheet_user_name,
            )
        if cfg.timesheet_date:
            flow_date.run(page, cfg, run_dir, target_date=cfg.timesheet_date)
        flow_delete.run(page, cfg, run_dir, rule=rule)
        shot(page, run_dir, "ok")
        rt.save_state()
    except Exception:
        shot(page, run_dir, "99-error")
        raise
    finally:
        rt.close()

    return 0
