"""
DashboardScenario — Verify dashboard loads after checkout, plan tier is displayed,
and key UI elements are present.

config keys:
    dashboard_url (str)             — optional URL to navigate to (if not already there)
    plan_tier_text (str)            — expected plan tier text visible on dashboard (e.g. "Professional")
    plan_tier_selector (str)        — CSS selector for plan tier display element
    required_selectors (list[str])  — list of CSS selectors that must be visible on dashboard
    required_texts (list[str])      — list of text strings that must be visible on dashboard
"""

from .base import BaseScenario, ScenarioResult


class DashboardScenario(BaseScenario):
    name = "dashboard"

    async def run(self, page, config: dict) -> None:
        # -- Step 1: Navigate to dashboard (if URL provided)
        dashboard_url = config.get("dashboard_url", "")
        if dashboard_url:
            await self._navigate(dashboard_url, step_name="navigate_to_dashboard")

        # -- Step 2: Verify dashboard page loaded (check URL or title)
        step = self._new_step("verify_dashboard_loaded")
        try:
            await page.wait_for_load_state("domcontentloaded", timeout=self._timeout)
            current_url = page.url
            self._finish_step(step, "pass", f"Dashboard loaded at {current_url}")
        except Exception as exc:
            step.screenshot_path = await self._screenshot("dashboard_load")
            self._finish_step(step, "error", str(exc))
            return

        # -- Step 3: Verify plan tier text is displayed
        plan_tier_text = config.get("plan_tier_text", "")
        plan_tier_selector = config.get("plan_tier_selector", "")
        if plan_tier_text:
            await self._verify_text_visible(plan_tier_text, step_name="verify_plan_tier_text")
        elif plan_tier_selector:
            await self._verify_selector_visible(plan_tier_selector, step_name="verify_plan_tier_element")

        # -- Step 4: Verify required CSS selectors
        required_selectors: list = config.get("required_selectors", [])
        for selector in required_selectors:
            label = selector.replace(" ", "_").replace("[", "").replace("]", "")[:40]
            await self._verify_selector_visible(selector, step_name=f"verify_selector_{label}")

        # -- Step 5: Verify required text strings
        required_texts: list = config.get("required_texts", [])
        for text in required_texts:
            label = text[:30].replace(" ", "_")
            await self._verify_text_visible(text, step_name=f"verify_text_{label}")

        # -- Step 6: Screenshot of dashboard
        await self._capture_screenshot_step("dashboard_state")
