"""
LoginScenario — Navigate to login URL, fill credentials, submit, verify authenticated state.

config keys:
    login_url (str)                — URL of login page
    email_selector (str)           — CSS selector for email/username field (default: input[type=email])
    password_selector (str)        — CSS selector for password field (default: input[type=password])
    submit_selector (str)          — CSS selector for submit button (default: button[type=submit])
    success_selector (str)         — CSS selector visible only when authenticated
    success_url_fragment (str)     — optional URL fragment present after successful login
    test_email (str)               — email to use
    test_password (str)            — password to use
"""

from .base import BaseScenario, ScenarioResult


class LoginScenario(BaseScenario):
    name = "login"

    async def run(self, page, config: dict) -> None:
        # -- Step 1: Navigate to login URL
        login_url = config.get("login_url", "")
        if not login_url:
            step = self._new_step("check_config")
            self._finish_step(step, "error", "login_url not provided in config")
            return

        await self._navigate(login_url, step_name="navigate_to_login")

        # -- Step 2: Fill email / username
        email_sel = config.get("email_selector", "input[type=email]")
        test_email = config.get("test_email", "")
        if not test_email:
            step = self._new_step("check_email_config")
            self._finish_step(step, "error", "test_email not provided in config")
            return
        await self._fill(email_sel, test_email, step_name="fill_email")

        # -- Step 3: Fill password
        pw_sel = config.get("password_selector", "input[type=password]")
        test_password = config.get("test_password", "")
        if not test_password:
            step = self._new_step("check_password_config")
            self._finish_step(step, "error", "test_password not provided in config")
            return
        await self._fill(pw_sel, test_password, step_name="fill_password")

        # -- Step 4: Submit form
        submit_sel = config.get("submit_selector", "button[type=submit]")
        await self._click(submit_sel, step_name="submit_form")

        # -- Step 5: Verify success — URL fragment
        success_url_fragment = config.get("success_url_fragment", "")
        if success_url_fragment:
            await self._verify_url_contains(success_url_fragment, step_name="verify_redirect_url")

        # -- Step 6: Verify success — authenticated element visible
        success_selector = config.get("success_selector", "")
        if success_selector:
            await self._verify_selector_visible(success_selector, step_name="verify_authenticated_indicator")

        # -- Step 7: Screenshot of authenticated state
        await self._capture_screenshot_step("post_login")
