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

import dev.lions.unionflow.server.api.dto.ong.ProjetOngDTO;
import dev.lions.unionflow.server.api.enums.ong.StatutProjetOng;
import dev.lions.unionflow.server.entity.Organisation;
import dev.lions.unionflow.server.entity.ong.ProjetOng;
import dev.lions.unionflow.server.mapper.ong.ProjetOngMapper;
import dev.lions.unionflow.server.repository.OrganisationRepository;
import dev.lions.unionflow.server.repository.ong.ProjetOngRepository;

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 ProjetOngService {

    @Inject
    ProjetOngRepository projetOngRepository;

    @Inject
    OrganisationRepository organisationRepository;

    @Inject
    ProjetOngMapper projetOngMapper;

    @Transactional
    public ProjetOngDTO creerProjet(ProjetOngDTO dto) {
        Organisation organisation = organisationRepository.findByIdOptional(UUID.fromString(dto.getOrganisationId()))
                .orElseThrow(() -> new NotFoundException(
                        "Organisation (ONG) non trouvée avec l'ID: " + dto.getOrganisationId()));

        ProjetOng projet = projetOngMapper.toEntity(dto);
        projet.setOrganisation(organisation);
        projet.setStatut(StatutProjetOng.EN_ETUDE);

        projetOngRepository.persist(projet);
        return projetOngMapper.toDto(projet);
    }

    public ProjetOngDTO getProjetById(UUID id) {
        ProjetOng projet = projetOngRepository.findByIdOptional(id)
                .orElseThrow(() -> new NotFoundException("Projet ONG non trouvé avec l'ID: " + id));
        return projetOngMapper.toDto(projet);
    }

    public List<ProjetOngDTO> getProjetsByOng(UUID organisationId) {
        return projetOngRepository.find("organisation.id = ?1 and actif = true", organisationId)
                .stream()
                .map(projetOngMapper::toDto)
                .collect(Collectors.toList());
    }

    @Transactional
    public ProjetOngDTO changerStatut(UUID id, StatutProjetOng statut) {
        ProjetOng projet = projetOngRepository.findByIdOptional(id)
                .orElseThrow(() -> new NotFoundException("Projet ONG non trouvé avec l'ID: " + id));
        projet.setStatut(statut);
        return projetOngMapper.toDto(projet);
    }
}
