# tests/integration/security/test_authentication.py
import pytest


@pytest.mark.integration
@pytest.mark.security
@pytest.mark.auth
class TestAuthentication:
    def test_protected_endpoint_without_auth(self, client):
        """Test that protected endpoints reject unauthenticated requests"""
        protected_endpoints = [
            "/api/v1/admin/users",
            "/api/v1/admin/vendors",
            "/api/v1/marketplace/import-jobs",
            "/api/v1/marketplace/product",
            "/api/v1/vendor",
            "/api/v1/stats",
            "/api/v1/inventory",
        ]

        for endpoint in protected_endpoints:
            response = client.get(endpoint)
            assert response.status_code == 401  # Authentication missing

    def test_protected_endpoint_with_invalid_token(self, client):
        """Test protected endpoints with invalid token"""
        headers = {"Authorization": "Bearer invalid_token_here"}

        response = client.get("/api/v1/marketplace/product", headers=headers)
        assert response.status_code == 401  # Token is not valid

    def test_debug_direct_bearer(self, client):
        """Test HTTPBearer directly"""
        response = client.get("/api/v1/debug-bearer")
        print(f"Direct Bearer - Status: {response.status_code}")
        print(
            f"Direct Bearer - Response: {response.json() if response.content else 'No content'}"
        )

    def test_debug_dependencies(self, client):
        """Debug the dependency chain step by step"""
        # Test 1: Direct endpoint with no auth
        response = client.get("/api/v1/admin/users")
        print(f"Admin endpoint - Status: {response.status_code}")
        try:
            print(f"Admin endpoint - Response: {response.json()}")
        except:
            print(f"Admin endpoint - Raw: {response.content}")

        # Test 2: Try a regular endpoint that uses get_current_user
        response2 = client.get(
            "/api/v1/marketplace/product"
        )  # or any endpoint with get_current_user
        print(f"Regular endpoint - Status: {response2.status_code}")
        try:
            print(f"Regular endpoint - Response: {response2.json()}")
        except:
            print(f"Regular endpoint - Raw: {response2.content}")

    def test_debug_available_routes(self, client):
        """Debug test to see all available routes"""
        print("\n=== All Available Routes ===")
        for route in client.app.routes:
            if hasattr(route, "path") and hasattr(route, "methods"):
                print(f"{list(route.methods)} {route.path}")

        print("\n=== Testing MarketplaceProduct Endpoint Variations ===")
        variations = [
            "/api/v1/marketplace/product",  # Your current attempt
            "/api/v1/marketplace/product/",  # With trailing slash
            "/api/v1/marketplace/product/list",  # With list endpoint
            "/api/v1/marketplace/product/all",  # With all endpoint
        ]

        for path in variations:
            response = client.get(path)
            print(f"{path}: Status {response.status_code}")
