from bson import ObjectId
from motor.motor_asyncio import AsyncIOMotorCollection

from domain.models import Service


class MongoServiceRepository:
    def __init__(
        self,
        service_collection: AsyncIOMotorCollection,
        stylist_collection: AsyncIOMotorCollection,
    ):
        self._services = service_collection
        self._stylists = stylist_collection

    async def list_available_services(self, salon_id: str) -> list[Service]:
        salon_oid = ObjectId(salon_id)

        stylists = await self._stylists.find(
            {"salonId": salon_oid},
            {"services": 1},
        ).to_list(length=None)

        service_ids: set[ObjectId] = set()
        for stylist in stylists:
            for service_id in stylist.get("services") or []:
                service_ids.add(service_id)

        if not service_ids:
            return []

        docs = await self._services.find(
            {
                "salonId": salon_oid,
                "_id": {"$in": list(service_ids)},
                "status": "active",
            },
            {"name": 1, "duration": 1, "basePrice": 1},
        ).to_list(length=None)

        return [
            Service(
                id=str(doc["_id"]),
                name=doc["name"],
                duration=doc.get("duration"),
                price=doc.get("basePrice"),
            )
            for doc in docs
        ]
