package sn.ladoum.bergerie.lignee;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import sn.ladoum.bergerie.entity.Mouton;
import sn.ladoum.bergerie.exception.ResourceNotFoundException;
import sn.ladoum.bergerie.repository.MoutonRepository;
import sn.ladoum.bergerie.service.MoutonService;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class LigneeService {

    private static final int PROFONDEUR_MAX = 10;

    private final MoutonRepository moutonRepository;
    private final MoutonService moutonService;

    public ArbreGenealogiqueDto arbre(Long moutonId, int profondeur) {
        Mouton m = moutonRepository.findById(moutonId)
                .orElseThrow(() -> ResourceNotFoundException.of("Mouton", moutonId));
        // Un éleveur ne peut consulter que les lignées de ses propres moutons
        moutonService.checkAccess(m);
        int p = Math.min(Math.max(profondeur, 1), PROFONDEUR_MAX);
        return build(m, p);
    }

    /** Variante publique : accessible à tout utilisateur authentifié (utilisée par la fiche publique / QR code). */
    public ArbreGenealogiqueDto arbrePublic(Long moutonId, int profondeur) {
        Mouton m = moutonRepository.findById(moutonId)
                .orElseThrow(() -> ResourceNotFoundException.of("Mouton", moutonId));
        int p = Math.min(Math.max(profondeur, 1), PROFONDEUR_MAX);
        return build(m, p);
    }

    private ArbreGenealogiqueDto build(Mouton m, int profondeurRestante) {
        if (m == null) return null;
        ArbreGenealogiqueDto.ArbreGenealogiqueDtoBuilder b = ArbreGenealogiqueDto.builder()
                .id(m.getId())
                .nom(m.getNom())
                .sexe(m.getSexe())
                .dateNaissance(m.getDateNaissance())
                .photo(m.getPhoto());
        if (profondeurRestante > 0) {
            b.pere(build(m.getPere(), profondeurRestante - 1));
            b.mere(build(m.getMere(), profondeurRestante - 1));
        }
        return b.build();
    }
}
