package sn.ladoum.bergerie.config;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import sn.ladoum.bergerie.entity.Mouton;
import sn.ladoum.bergerie.entity.Naissance;
import sn.ladoum.bergerie.repository.MoutonRepository;
import sn.ladoum.bergerie.repository.NaissanceRepository;

import java.util.List;

/**
 * Rattache chaque Mouton existant à sa Naissance via la nouvelle FK naissance_id,
 * en s'appuyant sur (mere_id, date_naissance). Idempotent : ne touche que les
 * moutons dont naissance_id est encore NULL.
 */
@Component
@RequiredArgsConstructor
@Slf4j
@Order(100)
public class NaissanceAgneauBackfill implements CommandLineRunner {

    private final NaissanceRepository naissanceRepository;
    private final MoutonRepository moutonRepository;

    @Override
    @Transactional
    public void run(String... args) {
        List<Naissance> naissances = naissanceRepository.findAll();
        int total = 0;
        for (Naissance n : naissances) {
            if (n.getMere() == null || n.getDate() == null) continue;
            List<Mouton> orphelins = moutonRepository
                    .findByMereIdAndDateNaissanceAndNaissanceIsNull(n.getMere().getId(), n.getDate());
            for (Mouton m : orphelins) {
                m.setNaissance(n);
                total++;
            }
            if (!orphelins.isEmpty()) {
                moutonRepository.saveAll(orphelins);
            }
        }
        if (total > 0) {
            log.info("Backfill naissance↔agneaux : {} mouton(s) rattaché(s) à leur naissance.", total);
        }
    }
}
