import pytest
from unittest.mock import patch, MagicMock


class TestStripeCheckoutSession:
    def test_create_checkout_returns_url_or_error(self, unauthed_client):
        resp = unauthed_client.post("/api/storefront/checkout", json={
            "domain": "babybinaural.com",
            "tier": "professional",
        })
        assert resp.status_code in (200, 500)
        data = resp.json()
        assert "checkout_url" in data or "error" in data

    def test_checkout_missing_domain_returns_400(self, unauthed_client):
        resp = unauthed_client.post("/api/storefront/checkout", json={
            "tier": "professional",
        })
        assert resp.status_code in (400, 422)

    def test_checkout_invalid_domain_returns_404(self, unauthed_client):
        resp = unauthed_client.post("/api/storefront/checkout", json={
            "domain": "nonexistent-domain-xyz-abc.com",
            "tier": "professional",
        })
        assert resp.status_code == 404


class TestStripeWebhook:
    def test_webhook_processes_completed_payment(self, unauthed_client):
        with patch("app.services.stripe_service.verify_webhook_signature") as mock_verify:
            mock_verify.return_value = {
                "type": "checkout.session.completed",
                "data": {"object": {"metadata": {"domain": "test.com"}, "payment_status": "paid"}},
            }
            resp = unauthed_client.post(
                "/api/storefront/webhook",
                content=b'{"test": true}',
                headers={"stripe-signature": "test_sig"},
            )
            assert resp.status_code == 200


class TestStripeFulfillment:
    def test_download_with_valid_token(self, unauthed_client):
        with patch("app.services.stripe_service.validate_download_token") as mock_token:
            mock_token.return_value = {"domain": "test.com", "valid": True}
            resp = unauthed_client.get("/api/storefront/download/test-token-123")
            assert resp.status_code in (200, 404)

    def test_download_with_invalid_token(self, unauthed_client):
        resp = unauthed_client.get("/api/storefront/download/invalid-token-xyz")
        assert resp.status_code in (401, 403, 404)
