package org.egl_cepgl.pm.service;

import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.implementation.bytecode.Throw;
import org.egl_cepgl.pm.dto.ProCategoryDto;
import org.egl_cepgl.pm.dto.ProcurementDto;
import org.egl_cepgl.pm.dto.ProjectDto;
import org.egl_cepgl.pm.exception.EntityNotFoundException;
import org.egl_cepgl.pm.model.*;
import org.egl_cepgl.pm.repository.ProcurementCategoryRepository;
import org.egl_cepgl.pm.repository.ProjectRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

@Slf4j
@Service
public class ProcurementCategoryService {

    private ProcurementCategoryRepository categoryRepository;
    private ProjectRepository projectRepository;

    @Autowired
    public ProcurementCategoryService(ProcurementCategoryRepository categoryRepository, ProjectRepository projectRepository) {
        this.categoryRepository = categoryRepository;
        this.projectRepository= projectRepository;
    }

    public ProcurementCategory add(ProcurementCategory obj)
    {
        log.info("ENREGGGGG=======ENG++"+obj.toString());
//        ProcurementCategory obj= ProCategoryDto.toEntity(dto);
//        Project project= projectRepository.findById(dto.getProject().getId()).get();
//        Set<ProcurementCategory> cats = project.getCategories();
//        cats.add(obj);
        return categoryRepository.save(obj);
//        return obj;
//        Project project= projectRepository.findByCode(dto.getProject().getCode());
//        if(project == null){
//            throw new EntityNotFoundException("Aucun Projet ne correspond à l'ID");
//        }
//        project.add(obj);
//        return ProCategoryDto.fromEntity(this.categoryRepository.save(obj));

//        ProjectDto pr= ProjectDto.fromEntity(this.projectRepository.findById(dto.getProject().getId()).get());
//        dto.setProject(pr);
//        return ProCategoryDto.fromEntity(this.categoryRepository.save(ProCategoryDto.toEntity(dto)));
    }

    public Page<ProcurementCategory> findAll(String search, int page, int size)
    {
        Pageable paging = PageRequest.of(page, size);
        Page<ProcurementCategory> objs;
        if (search == null) {
            objs = this.categoryRepository.findAll(paging);
        } else {
            objs = this.categoryRepository.findAllBySearch(search, paging);
        }
        return objs;
    }

    public ProCategoryDto update(ProCategoryDto dto)
    {
        return ProCategoryDto.fromEntity(this.categoryRepository.save(ProCategoryDto.toEntity(dto)));
    }

    public void delete(Long id)
    {
        if(id == null){
            log.error("ID est null");
            return;
        }
        categoryRepository.deleteById(id);
    }

    public Boolean existsByCode(String code)
    {
        if(categoryRepository.existsByCode(code)){
            return true;
        }
        return false;
    }
}
