package io.gmss.fiscad.implementations.infocad.parametre;

import io.gmss.fiscad.entities.infocad.parametre.Structure;
import io.gmss.fiscad.exceptions.BadRequestException;
import io.gmss.fiscad.exceptions.NotFoundException;
import io.gmss.fiscad.interfaces.infocad.parametre.StructureService;
import io.gmss.fiscad.paylaods.response.StructureResponse;
import io.gmss.fiscad.repositories.infocad.parametre.StructureRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class StructureServiceImpl implements StructureService {

    private final StructureRepository structureRepository;

    public StructureServiceImpl(StructureRepository structureRepository) {
        this.structureRepository = structureRepository;
    }

    @Override
    public Structure createStructure(Structure structure) throws BadRequestException {
        if (structure.getId() != null) {
            throw new BadRequestException("Impossible de créer une structure ayant un id non null.");
        }
        StringBuilder builder = new StringBuilder();
        builder.append("C");
        builder.append(structureRepository.getLastRecordId() + 1);
        structure.setCode(builder.toString());
        return structureRepository.save(structure);
    }

    @Override
    public Structure updateStructure(Long id, Structure structure) throws NotFoundException {

        System.out.println("structure = " + structure);

        if (structure.getId() == null) {
            throw new BadRequestException("Impossible de mettre à jour une structure ayant un id null.");
        }
        if (!structureRepository.existsById(structure.getId())) {
            throw new NotFoundException("Impossible de trouver la structure spécifiée dans notre base de données.");
        }
        try {
            structureRepository.save(structure);

        }catch (Exception e){
            e.printStackTrace();
        }

        Structure structure1 = structureRepository.getById(structure.getId());

        return structure1;
    }

    @Override
    public void deleteStructure(Long id) throws NotFoundException {
        Optional<Structure> structureOptional = structureRepository.findById(id);
        if (structureOptional.isPresent()) {
            structureRepository.deleteById(structureOptional.get().getId());
        } else {
            throw new NotFoundException("Impossible de trouver la structure spécifiée dans notre base de données.");
        }
    }

    @Override
    public Page<Structure> getStructureList(Pageable pageable) {
        return structureRepository.findAll(pageable);
    }

    @Override
    public List<Structure> getStructureList() {
        return structureRepository.findAll();
    }

    @Override
    public List<StructureResponse> getStructuresByArrondissement(Long arrondissementID) {
        return structureRepository.getStructureByArrondissement(arrondissementID);
    }

    @Override
    public Optional<Structure> getStructureById(Long id) {
        if (structureRepository.existsById(id)) {
            return structureRepository.findById(id);
        } else {
            throw new NotFoundException("Impossible de trouver la structure spécifiée dans la base de données.");
        }
    }
}
