from typing import Optional

from ...domain.repositories.consultor_repository import ConsultorRepository
from ..dtos.consultor_dto import ConsultorDetalhadoDTO
from .obter_ranking import ObterRankingUseCase


class ObterConsultorUseCase:
    def __init__(self, repository: ConsultorRepository):
        self.repository = repository
        self.ranking_use_case = ObterRankingUseCase(repository)

    async def executar(self, id_pessoa: int, rank: Optional[int] = None) -> Optional[ConsultorDetalhadoDTO]:
        consultor = await self.repository.buscar_por_id(id_pessoa)
        if not consultor:
            return None

        if rank is None:
            # Fallback legado: pode ser incompleto em grandes bases.
            ranking_completo = await self.repository.buscar_ranking(limite=1000)
            rank = next(
                (idx + 1 for idx, c in enumerate(ranking_completo) if c.id_pessoa == id_pessoa), None
            )

        return self.ranking_use_case._converter_para_dto_detalhado(consultor, rank or 0)
