package com.progetto.VEBS.service;

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

import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.rest.webmvc.ResourceNotFoundException;
import org.springframework.stereotype.Service;

import com.progetto.VEBS.mapper.IngressoAreaVerdeMapper;
import com.progetto.VEBS.model.dto.IngressoAreaVerdeDTO;
import com.progetto.VEBS.model.entity.IngressoAreaBlu;
import com.progetto.VEBS.model.entity.Ingresso;
import com.progetto.VEBS.model.repository.IngressoAreaVerdeRepository;

@Service
public class IngressoService {

	@Autowired
	private IngressoAreaVerdeMapper mapper;
	
	@Autowired
	private IngressoAreaVerdeRepository ingressoAreaVerdeRepository;

	public List<IngressoAreaVerdeDTO> getAllIngressiAreeVerdi() {
	    return ingressoAreaVerdeRepository.findAll().stream()
	        .map(mapper::toDTO)
	        .collect(Collectors.toList());
	}

	public IngressoAreaVerdeDTO getIngressoAreaVerdeById(Integer id) {
	    return ingressoAreaVerdeRepository.findById(id).map(mapper::toDTO)
	            .orElse(null);
	}

	public void saveIngresso(IngressoAreaVerdeDTO ingresso_area_verde) {
	    ingressoAreaVerdeRepository.save(mapper.toEntity(ingresso_area_verde));	
	}

	public Ingresso deleteIngressoAreaVerdeById(Integer id) throws ResourceNotFoundException {
		Ingresso ingresso = ingressoAreaVerdeRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Record non trovato")); 
		ingressoAreaVerdeRepository.deleteById(id);
		return ingresso;
	}

	public void updateAreaVerde(IngressoAreaVerdeDTO ingresso_area_verde_dto) throws ResourceNotFoundException {

		Ingresso ingresso = ingressoAreaVerdeRepository.findById(ingresso_area_verde_dto.getId()).orElseThrow(() -> new ResourceNotFoundException("Record non trovato")); 
		
		WKTReader reader = new WKTReader();
		Geometry geom;
		try {
			geom = reader.read(ingresso_area_verde_dto.getWKTGeometry());
			ingresso.setGeometry(geom);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ingresso.setId(ingresso_area_verde_dto.getId());
		ingresso.setNome(ingresso_area_verde_dto.getNome());
		ingresso.setAreaVerde(ingresso_area_verde_dto.getAreaVerde());

		ingressoAreaVerdeRepository.saveAndFlush(ingresso);
	}
}
