from typing import Any

from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from app.plugins.product_media_roles.models import ProductMediaRole, ProductMediaRoleItem
from app.plugins.product_media_roles.schemas import StoreProductMediaRoleItemOut


def pick_role_images(grouped: dict[str, list[Any]], role_code: str, limit: int = 3) -> list[str]:
    images: list[str] = []
    for item in grouped.get(role_code, []):
        if isinstance(item, dict):
            image_url = item.get("image_url")
        else:
            image_url = getattr(item, "image_url", None)
        if image_url:
            images.append(image_url)
        if len(images) >= limit:
            break
    return images


async def list_store_product_media_roles(
    db: AsyncSession,
    tenant_id: int,
    product_id: int,
) -> dict[str, list[StoreProductMediaRoleItemOut]]:
    result = await db.execute(
        select(ProductMediaRoleItem, ProductMediaRole)
        .join(ProductMediaRole, ProductMediaRoleItem.role_id == ProductMediaRole.id)
        .where(
            ProductMediaRoleItem.tenant_id == tenant_id,
            ProductMediaRoleItem.product_id == product_id,
            ProductMediaRoleItem.is_active == 1,
            ProductMediaRole.tenant_id == tenant_id,
            ProductMediaRole.is_active == 1,
        )
        .order_by(ProductMediaRole.sort_order, ProductMediaRoleItem.sort_order, ProductMediaRoleItem.id)
    )
    grouped: dict[str, list[StoreProductMediaRoleItemOut]] = {}
    for item, role in result.all():
        grouped.setdefault(role.code, []).append(
            StoreProductMediaRoleItemOut(
                id=item.id,
                image_url=item.image_url,
                alt_text=item.alt_text,
                sort_order=item.sort_order,
            )
        )
    return grouped
