import logging
from typing import Optional

from api.v1.schemas.artist import (
    LastFmArtistEnrichment,
    LastFmSimilarArtistSchema,
)
from api.v1.schemas.common import LastFmTagSchema
from infrastructure.validators import clean_lastfm_bio
from repositories.protocols import LastFmRepositoryProtocol
from services.preferences_service import PreferencesService

logger = logging.getLogger(__name__)


class ArtistEnrichmentService:
    def __init__(
        self,
        lastfm_repo: LastFmRepositoryProtocol,
        preferences_service: PreferencesService,
    ):
        self._lastfm_repo = lastfm_repo
        self._preferences_service = preferences_service

    async def get_lastfm_enrichment(
        self, artist_mbid: str, artist_name: str
    ) -> Optional[LastFmArtistEnrichment]:
        if not self._preferences_service.is_lastfm_enabled():
            return None

        try:
            info = await self._lastfm_repo.get_artist_info(
                artist=artist_name, mbid=artist_mbid
            )
            if info is None:
                return None

            tags = [
                LastFmTagSchema(name=t.name, url=t.url or None)
                for t in (info.tags or [])
            ]
            similar = [
                LastFmSimilarArtistSchema(
                    name=s.name,
                    mbid=s.mbid,
                    match=s.match,
                    url=s.url or None,
                )
                for s in (info.similar or [])
            ]

            return LastFmArtistEnrichment(
                bio=clean_lastfm_bio(info.bio_summary) or None,
                summary=None,
                tags=tags,
                listeners=info.listeners,
                playcount=info.playcount,
                similar_artists=similar,
                url=info.url or None,
            )
        except Exception as e:  # noqa: BLE001
            logger.warning(
                "Failed to fetch Last.fm enrichment for artist %s: %s",
                artist_mbid[:8],
                e,
            )
            return None
