"""Shared helpers for the cards-area UI tests (provider tab + account card)."""

from __future__ import annotations

from typing import Any

from ui.view_model import AccountVM, DashboardCallbacks, QuotaBarVM


def make_callbacks(calls: list[tuple[Any, ...]]) -> DashboardCallbacks:
    return DashboardCallbacks(
        on_set_default=lambda tool, slug: calls.append(("set_default", tool, slug)),
        on_reload=lambda tool, slug: calls.append(("reload", tool, slug)),
        on_repair=lambda tool, slug: calls.append(("repair", tool, slug)),
        on_rename=lambda tool, slug: calls.append(("rename", tool, slug)),
        on_remove=lambda tool, slug: calls.append(("remove", tool, slug)),
        on_add=lambda tool: calls.append(("add", tool)),
        on_open_settings=lambda: calls.append(("open_settings",)),
        on_set_limits=lambda tool, slug: calls.append(("set_limits", tool, slug)),
        on_toggle_lock=lambda tool, slug: calls.append(("toggle_lock", tool, slug)),
        on_gateway=lambda tool, slug, action: calls.append(("gateway", tool, slug, action)),
        on_tab_changed=lambda tab_id: calls.append(("tab_changed", tab_id)),
    )


def make_bar(**overrides: Any) -> QuotaBarVM:
    fields: dict[str, Any] = {
        "window_label": "5h",
        "fraction": 0.42,
        "reset_text": "↺ 2h10m",
        "level": "ok",
    }
    fields.update(overrides)
    left_pct = 100 - round(fields["fraction"] * 100)
    fields.setdefault("left_pct", left_pct)
    fields.setdefault("percent_text", f"{fields['left_pct']}% left")
    return QuotaBarVM(**fields)


def make_account_vm(**overrides: Any) -> AccountVM:
    fields: dict[str, Any] = {
        "tool": "codex",
        "slug": "work",
        "alias": "Work",
        "plan_text": "plus",
        "is_default": False,
        "health": "ok",
        "health_text": "Healthy",
        "attention": False,
        "primary": make_bar(),
        "secondary": make_bar(window_label="7d", fraction=0.67),
        "checked_text": "⟳ 12s ago",
        "primary_action": "set_default",
        "primary_action_label": "Set as default",
        "busy_actions": frozenset(),
    }
    fields.update(overrides)
    return AccountVM(**fields)
