"""Tests for garment listing and filtering (GET /garments)."""

import uuid

import pytest
from httpx import AsyncClient

GLOBAL_USER_ID = "00000000-0000-0000-0000-000000000000"


@pytest.mark.asyncio
async def test_garments_list_empty(client: AsyncClient):
    """GET /garments for user with no garments → empty list."""
    random_user = uuid.uuid4()
    resp = await client.get("/api/v1/garments", params={"user_id": str(random_user)})
    assert resp.status_code == 200
    data = resp.json()
    assert data["items"] == []
    assert data["meta"]["total"] == 0
    assert data["meta"]["page"] == 1


@pytest.mark.asyncio
async def test_garments_list_after_analyze(client: AsyncClient, sample_jpeg: bytes):
    """Garments list should contain items after garment analysis."""
    resp = await client.post(
        "/api/v1/garments/analyze",
        files={"image": ("test.jpg", sample_jpeg, "image/jpeg")},
    )
    assert resp.status_code == 200

    # List global user garments
    resp = await client.get("/api/v1/garments", params={"user_id": GLOBAL_USER_ID})
    assert resp.status_code == 200
    data = resp.json()
    assert data["meta"]["total"] >= 1
    assert len(data["items"]) >= 1

    item = data["items"][0]
    assert "id" in item
    assert "user_id" in item
    assert "category_main" in item
    assert "tags" in item


@pytest.mark.asyncio
async def test_garments_list_cross_user(client: AsyncClient, sample_jpeg: bytes):
    """GET /garments without user_id → all users (cross-user query)."""
    await client.post(
        "/api/v1/garments/analyze",
        files={"image": ("test.jpg", sample_jpeg, "image/jpeg")},
    )

    resp = await client.get("/api/v1/garments")
    assert resp.status_code == 200
    data = resp.json()
    assert data["meta"]["total"] >= 1


@pytest.mark.asyncio
async def test_garments_filter_category(client: AsyncClient, sample_jpeg: bytes):
    """Filter garments by category_main."""
    await client.post(
        "/api/v1/garments/analyze",
        files={"image": ("test.jpg", sample_jpeg, "image/jpeg")},
    )

    # Filter by "top" (mock returns "top")
    resp = await client.get("/api/v1/garments", params={"category_main": "top"})
    assert resp.status_code == 200
    data = resp.json()
    for item in data["items"]:
        assert item["category_main"] == "top"

    # Filter by non-matching category
    resp = await client.get("/api/v1/garments", params={"category_main": "outer"})
    data = resp.json()
    assert data["meta"]["total"] >= 0


@pytest.mark.asyncio
async def test_garments_pagination(client: AsyncClient):
    """Pagination params should be respected."""
    resp = await client.get("/api/v1/garments", params={"page": 1, "size": 5})
    assert resp.status_code == 200
    data = resp.json()
    assert data["meta"]["page"] == 1
    assert data["meta"]["size"] == 5
    assert len(data["items"]) <= 5


@pytest.mark.asyncio
async def test_garments_invalid_page_size(client: AsyncClient):
    """Invalid page/size params should be rejected."""
    resp = await client.get("/api/v1/garments", params={"page": 0})
    assert resp.status_code == 422

    resp = await client.get("/api/v1/garments", params={"size": 200})
    assert resp.status_code == 422
