package dev.lions.unionflow.server.service.agricole;

import dev.lions.unionflow.server.api.dto.agricole.CampagneAgricoleDTO;
import dev.lions.unionflow.server.entity.Organisation;
import dev.lions.unionflow.server.entity.agricole.CampagneAgricole;
import dev.lions.unionflow.server.mapper.agricole.CampagneAgricoleMapper;
import dev.lions.unionflow.server.repository.OrganisationRepository;
import dev.lions.unionflow.server.repository.agricole.CampagneAgricoleRepository;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.NotFoundException;

import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@ApplicationScoped
public class CampagneAgricoleService {

    @Inject
    CampagneAgricoleRepository campagneAgricoleRepository;

    @Inject
    OrganisationRepository organisationRepository;

    @Inject
    CampagneAgricoleMapper campagneAgricoleMapper;

    @Transactional
    public CampagneAgricoleDTO creerCampagne(CampagneAgricoleDTO dto) {
        Organisation organisation = organisationRepository
                .findByIdOptional(UUID.fromString(dto.getOrganisationCoopId()))
                .orElseThrow(() -> new NotFoundException(
                        "Coopérative non trouvée avec l'ID: " + dto.getOrganisationCoopId()));

        CampagneAgricole campagne = campagneAgricoleMapper.toEntity(dto);
        campagne.setOrganisation(organisation);

        campagneAgricoleRepository.persist(campagne);
        return campagneAgricoleMapper.toDto(campagne);
    }

    public CampagneAgricoleDTO getCampagneById(UUID id) {
        CampagneAgricole campagne = campagneAgricoleRepository.findByIdOptional(id)
                .orElseThrow(() -> new NotFoundException("Campagne agricole non trouvée avec l'ID: " + id));
        return campagneAgricoleMapper.toDto(campagne);
    }

    public List<CampagneAgricoleDTO> getCampagnesByCooperative(UUID organisationId) {
        return campagneAgricoleRepository.find("organisation.id = ?1 and actif = true", organisationId)
                .stream()
                .map(campagneAgricoleMapper::toDto)
                .collect(Collectors.toList());
    }
}
