# tests/integration/api/v1/admin/test_vendor_products.py
"""
Integration tests for admin vendor product catalog endpoints.

Tests the /api/v1/admin/vendor-products endpoints.
"""

import pytest


@pytest.mark.integration
@pytest.mark.api
@pytest.mark.admin
@pytest.mark.products
class TestAdminVendorProductsAPI:
    """Tests for admin vendor products endpoints."""

    def test_get_vendor_products_admin(self, client, admin_headers, test_product):
        """Test admin getting all vendor products."""
        response = client.get("/api/v1/admin/vendor-products", headers=admin_headers)

        assert response.status_code == 200
        data = response.json()
        assert "products" in data
        assert "total" in data
        assert "skip" in data
        assert "limit" in data
        assert data["total"] >= 1
        assert len(data["products"]) >= 1

        # Check that test_product is in the response
        product_ids = [p["id"] for p in data["products"]]
        assert test_product.id in product_ids

    def test_get_vendor_products_non_admin(self, client, auth_headers):
        """Test non-admin trying to access vendor products endpoint."""
        response = client.get("/api/v1/admin/vendor-products", headers=auth_headers)

        assert response.status_code == 403
        data = response.json()
        assert data["error_code"] == "ADMIN_REQUIRED"

    def test_get_vendor_products_with_vendor_filter(
        self, client, admin_headers, test_product, test_vendor
    ):
        """Test admin filtering products by vendor."""
        response = client.get(
            "/api/v1/admin/vendor-products",
            params={"vendor_id": test_vendor.id},
            headers=admin_headers,
        )

        assert response.status_code == 200
        data = response.json()
        assert data["total"] >= 1
        # All products should be from the filtered vendor
        for product in data["products"]:
            assert product["vendor_id"] == test_vendor.id

    def test_get_vendor_products_with_active_filter(
        self, client, admin_headers, test_product
    ):
        """Test admin filtering products by active status."""
        response = client.get(
            "/api/v1/admin/vendor-products",
            params={"is_active": True},
            headers=admin_headers,
        )

        assert response.status_code == 200
        data = response.json()
        # All products should be active
        for product in data["products"]:
            assert product["is_active"] is True

    def test_get_vendor_products_with_featured_filter(
        self, client, admin_headers, test_product
    ):
        """Test admin filtering products by featured status."""
        response = client.get(
            "/api/v1/admin/vendor-products",
            params={"is_featured": False},
            headers=admin_headers,
        )

        assert response.status_code == 200
        data = response.json()
        # All products should not be featured
        for product in data["products"]:
            assert product["is_featured"] is False

    def test_get_vendor_products_pagination(self, client, admin_headers, test_product):
        """Test admin vendor products pagination."""
        response = client.get(
            "/api/v1/admin/vendor-products",
            params={"skip": 0, "limit": 10},
            headers=admin_headers,
        )

        assert response.status_code == 200
        data = response.json()
        assert data["skip"] == 0
        assert data["limit"] == 10

    def test_get_vendor_product_stats_admin(self, client, admin_headers, test_product):
        """Test admin getting vendor product statistics."""
        response = client.get(
            "/api/v1/admin/vendor-products/stats", headers=admin_headers
        )

        assert response.status_code == 200
        data = response.json()
        assert "total" in data
        assert "active" in data
        assert "inactive" in data
        assert "featured" in data
        assert "digital" in data
        assert "physical" in data
        assert "by_vendor" in data
        assert data["total"] >= 1

    def test_get_vendor_product_stats_non_admin(self, client, auth_headers):
        """Test non-admin trying to access vendor product stats."""
        response = client.get(
            "/api/v1/admin/vendor-products/stats", headers=auth_headers
        )

        assert response.status_code == 403

    def test_get_catalog_vendors_admin(
        self, client, admin_headers, test_product, test_vendor
    ):
        """Test admin getting list of vendors with products."""
        response = client.get(
            "/api/v1/admin/vendor-products/vendors", headers=admin_headers
        )

        assert response.status_code == 200
        data = response.json()
        assert "vendors" in data
        assert isinstance(data["vendors"], list)
        assert len(data["vendors"]) >= 1

        # Check that test_vendor is in the list
        vendor_ids = [v["id"] for v in data["vendors"]]
        assert test_vendor.id in vendor_ids

    def test_get_vendor_product_detail_admin(self, client, admin_headers, test_product):
        """Test admin getting vendor product detail."""
        response = client.get(
            f"/api/v1/admin/vendor-products/{test_product.id}",
            headers=admin_headers,
        )

        assert response.status_code == 200
        data = response.json()
        assert data["id"] == test_product.id
        assert data["vendor_id"] == test_product.vendor_id
        assert data["marketplace_product_id"] == test_product.marketplace_product_id
        assert "source_marketplace" in data
        assert "source_vendor" in data

    def test_get_vendor_product_detail_not_found(self, client, admin_headers):
        """Test admin getting non-existent vendor product detail."""
        response = client.get(
            "/api/v1/admin/vendor-products/99999", headers=admin_headers
        )

        assert response.status_code == 404
        data = response.json()
        assert data["error_code"] == "PRODUCT_NOT_FOUND"

    def test_remove_vendor_product_admin(self, client, admin_headers, test_product, db):
        """Test admin removing product from vendor catalog."""
        product_id = test_product.id

        response = client.delete(
            f"/api/v1/admin/vendor-products/{product_id}",
            headers=admin_headers,
        )

        assert response.status_code == 200
        data = response.json()
        assert "message" in data
        assert "removed" in data["message"].lower()

        # Verify product is removed
        response = client.get(
            f"/api/v1/admin/vendor-products/{product_id}",
            headers=admin_headers,
        )
        assert response.status_code == 404

    def test_remove_vendor_product_not_found(self, client, admin_headers):
        """Test admin removing non-existent vendor product."""
        response = client.delete(
            "/api/v1/admin/vendor-products/99999",
            headers=admin_headers,
        )

        assert response.status_code == 404
        data = response.json()
        assert data["error_code"] == "PRODUCT_NOT_FOUND"

    def test_remove_vendor_product_non_admin(self, client, auth_headers, test_product):
        """Test non-admin trying to remove product."""
        response = client.delete(
            f"/api/v1/admin/vendor-products/{test_product.id}",
            headers=auth_headers,
        )

        assert response.status_code == 403
