"""Wardrobe service — list, filter, paginate garments with optional cross-user queries."""

import uuid

from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import joinedload

from app.models.garment import Garment


class WardrobeService:
    async def list_garments(
        self,
        db: AsyncSession,
        *,
        user_id: uuid.UUID | None = None,
        category_main: str | None = None,
        category_sub: str | None = None,
        style: str | None = None,
        color: str | None = None,
        page: int = 1,
        size: int = 20,
    ) -> tuple[list[Garment], int]:
        """Return (garments, total_count) with optional filters.

        user_id=None means all users (cross-user query).
        Garment.user relationship is eagerly loaded for user_name access.
        """
        # Build filter conditions once
        filters = []
        if user_id is not None:
            filters.append(Garment.user_id == user_id)
        if category_main:
            filters.append(Garment.category_main == category_main)
        if category_sub:
            filters.append(Garment.category_sub == category_sub)
        if style:
            filters.append(Garment.tags["style"].astext.contains(style))
        if color:
            filters.append(Garment.tags["color"].astext.contains(color))

        # Data query (with eager-loaded user for user_name)
        base = select(Garment).options(joinedload(Garment.user))
        for f in filters:
            base = base.where(f)

        # Count query (no eager load needed)
        count_q = select(func.count()).select_from(
            select(Garment.id).where(*filters).subquery()
        )
        total = (await db.execute(count_q)).scalar_one()

        # Paginated results
        query = base.order_by(Garment.created_at.desc()).offset((page - 1) * size).limit(size)
        result = await db.execute(query)
        garments = list(result.unique().scalars().all())

        return garments, total
