from domain.models import Service
from ports.service_repository import ServiceRepository


class ResolveServicesByNamesUseCase:
    def __init__(self, repository: ServiceRepository):
        self._repository = repository

    async def execute(self, salon_id: str, service_names: list[str]) -> list[Service]:
        catalog = await self._repository.list_available_services(salon_id)
        if not catalog or not service_names:
            return []

        matched: list[Service] = []
        seen_ids: set[str] = set()

        for raw_name in service_names:
            normalized = raw_name.strip().lower()
            if not normalized:
                continue

            found = self._find_match(normalized, catalog)
            if found and found.id not in seen_ids:
                matched.append(found)
                seen_ids.add(found.id)

        return matched

    @staticmethod
    def _find_match(normalized: str, catalog: list[Service]) -> Service | None:
        for service in catalog:
            name = service.name.lower()
            if name == normalized:
                return service

        for service in catalog:
            name = service.name.lower()
            if normalized in name or name in normalized:
                return service

        return None
