"""End-to-end tests for subscription and payment flows."""
import pytest
from playwright.sync_api import Page, expect


def test_view_pricing_page(page: Page, base_url: str):
    """Test pricing page displays correctly."""
    page.goto(f"{base_url}/pricing")
    
    # Should show all three plans
    expect(page.locator('text=Free')).to_be_visible()
    expect(page.locator('text=Pro')).to_be_visible()
    expect(page.locator('text=Enterprise')).to_be_visible()


def test_upgrade_to_pro_flow(page: Page, base_url: str):
    """Test Pro upgrade flow (test mode)."""
    # Login first
    page.goto(f"{base_url}/login")
    page.fill('input[name="username"]', 'testuser')
    page.fill('input[name="password"]', 'SecurePass123!')
    page.click('button[type="submit"]')
    
    # Go to pricing
    page.goto(f"{base_url}/pricing")
    
    # Click Pro upgrade button
    page.click('text=Upgrade to Pro')
    
    # Should redirect to Stripe checkout or show checkout modal
    page.wait_for_url('**/checkout**', timeout=10000)


def test_view_subscription_page(page: Page, base_url: str):
    """Test subscription management page."""
    # Login first
    page.goto(f"{base_url}/login")
    page.fill('input[name="username"]', 'testuser')
    page.fill('input[name="password"]', 'SecurePass123!')
    page.click('button[type="submit"]')
    
    # Navigate to subscription page
    page.goto(f"{base_url}/subscription")
    
    # Should show subscription status
    expect(page.locator('text=Plan')).to_be_visible(timeout=5000)


def test_cancel_subscription(page: Page, base_url: str):
    """Test subscription cancellation flow."""
    # Login and navigate to subscription
    page.goto(f"{base_url}/login")
    page.fill('input[name="username"]', 'testuser')
    page.fill('input[name="password"]', 'SecurePass123!')
    page.click('button[type="submit"]')
    
    page.goto(f"{base_url}/subscription")
    
    # Click cancel button
    page.click('button:has-text("Cancel")')
    
    # Confirm cancellation in dialog
    page.on('dialog', lambda dialog: dialog.accept())
    
    # Should show cancellation confirmation
    expect(page.locator('text=canceled')).to_be_visible(timeout=5000)
