from __future__ import annotations

from pathlib import Path
from unittest import TestCase

_REPO_ROOT = Path(__file__).resolve().parents[2]
_FRONTEND = _REPO_ROOT / "frontend/src"


class TestPaymentReturnPageContracts(TestCase):
    """Source-code contracts for the payment-return page."""

    def _read_page(self) -> str:
        path = _FRONTEND / "routes/(public)/payment-return/+page.svelte"
        return path.read_text(encoding="utf-8")

    def _read_server(self) -> str:
        path = _FRONTEND / "routes/(public)/payment-return/+page.server.ts"
        return path.read_text(encoding="utf-8")

    # ── Server load contracts ─────────────────────────────────────

    def test_server_parses_payment_id_from_query_params(self) -> None:
        source = self._read_server()
        self.assertIn("url.searchParams.get('id')", source)

    def test_server_calls_fetch_payment_status(self) -> None:
        source = self._read_server()
        self.assertIn("fetchPaymentStatus", source)

    def test_server_returns_ui_state(self) -> None:
        source = self._read_server()
        self.assertIn("uiState", source)

    def test_server_returns_verified_flag(self) -> None:
        source = self._read_server()
        self.assertIn("verified", source)

    def test_server_has_fallback_on_verification_failure(self) -> None:
        source = self._read_server()
        self.assertIn("catch", source)
        self.assertIn("verified: false", source)

    def test_server_maps_mollie_statuses(self) -> None:
        source = self._read_server()
        for mollie_status in ("paid", "canceled", "pending", "expired", "failed"):
            self.assertIn(mollie_status, source)

    # ── Page UI state contracts ──────────────────────────────────

    def test_page_renders_success_state(self) -> None:
        source = self._read_page()
        self.assertIn("Payment successful", source)

    def test_page_renders_cancelled_state(self) -> None:
        source = self._read_page()
        self.assertIn("Payment cancelled", source)

    def test_page_renders_pending_state(self) -> None:
        source = self._read_page()
        self.assertIn("Payment processing", source)

    def test_page_renders_expired_state(self) -> None:
        source = self._read_page()
        self.assertIn("Payment expired", source)

    def test_page_renders_failed_state(self) -> None:
        source = self._read_page()
        self.assertIn("Payment failed", source)

    def test_page_renders_unknown_fallback_state(self) -> None:
        source = self._read_page()
        self.assertIn("Payment status unknown", source)

    def test_page_shows_verification_warning_when_unverified(self) -> None:
        source = self._read_page()
        self.assertIn("Verification pending", source)
        self.assertIn("!data.verified", source)

    def test_page_uses_shadcn_card(self) -> None:
        source = self._read_page()
        self.assertIn("$lib/components/ui/card", source)

    def test_page_uses_shadcn_badge(self) -> None:
        source = self._read_page()
        self.assertIn("$lib/components/ui/badge", source)

    def test_page_uses_shadcn_alert(self) -> None:
        source = self._read_page()
        self.assertIn("$lib/components/ui/alert", source)

    def test_page_has_action_buttons(self) -> None:
        source = self._read_page()
        self.assertIn("Go to billing", source)
        self.assertIn("Try again", source)


class TestCheckoutSuccessPageContracts(TestCase):
    """Source-code contracts for the checkout success page."""

    def _read_page(self) -> str:
        path = _FRONTEND / "routes/(public)/checkout/success/+page.svelte"
        return path.read_text(encoding="utf-8")

    def _read_server(self) -> str:
        path = _FRONTEND / "routes/(public)/checkout/success/+page.server.ts"
        return path.read_text(encoding="utf-8")

    def test_page_shows_subscription_confirmation(self) -> None:
        source = self._read_page()
        self.assertIn("Subscription confirmed", source)

    def test_page_shows_plan_badge_when_provided(self) -> None:
        source = self._read_page()
        self.assertIn("data.plan", source)
        self.assertIn("Badge", source)

    def test_page_has_dashboard_navigation(self) -> None:
        source = self._read_page()
        self.assertIn("Go to dashboard", source)

    def test_page_has_billing_navigation(self) -> None:
        source = self._read_page()
        self.assertIn("View billing", source)
        self.assertIn("/billing", source)

    def test_page_uses_shadcn_card(self) -> None:
        source = self._read_page()
        self.assertIn("$lib/components/ui/card", source)

    def test_page_shows_next_steps(self) -> None:
        source = self._read_page()
        self.assertIn("next", source.lower())

    def test_server_accepts_plan_query_param(self) -> None:
        source = self._read_server()
        self.assertIn("plan", source)

    def test_success_icon_present(self) -> None:
        source = self._read_page()
        self.assertIn("circle-check", source)
