package com.dacrt.SBIABackend.service;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dacrt.SBIABackend.dto.Mapper;
import com.dacrt.SBIABackend.dto.requestDto.UnidadRequestDto;

import com.dacrt.SBIABackend.dto.responseDto.UnidadResponseDto;

/*import com.dacrt.SBIABackend.entity.UbicacionesTi;
import com.dacrt.SBIABackend.entity.Maestroevaluacion;
import com.dacrt.SBIABackend.entity.Parametros;
import com.dacrt.SBIABackend.entity.Proceso;
import com.dacrt.SBIABackend.entity.Cargos;*/
import com.dacrt.SBIABackend.entity.Unidad;
import com.dacrt.SBIABackend.entity.UnidadAdscripcion;


//import com.dacrt.SBIABackend.repository.UnidadAdscripcionRepository;
//import com.dacrt.SBIABackend.repository.UbicacionesTiRepository;
//import com.dacrt.SBIABackend.repository.VistaUnidadesAllRepository;
import com.dacrt.SBIABackend.repository.UnidadRepository;

@Service
@Transactional
public class UnidadServiceImpl implements UnidadService{

	@Autowired
	private UnidadRepository unidadRepository;
	//@Autowired
	//private VistaUnidadesAllRepository vistaUnidadesAllRepository;
	//@Autowired
	//private ProcesoRepository procesosRepository;
	//@Autowired
	//private UnidadAdscripcionRepository unidadAdscripcionRepository;
//	@Autowired
//	private UbicacionesTiRepository UbicacionesTiRepository;
	//@Autowired
	//private ParametrosRepository parametrosRepository;
	/*@Autowired
	private VistatotalunidadesconevaluacionesRepository vistatotalunidadesconevaluacionesRepository;
	@Autowired
	private VistaResumenPorUnidadRepository vistaResumenPorUnidadRepository;
	@Autowired
	private VistaPersonalxDiadeContingenciaRepository vistaPersonalxDiadeContingenciaRepository;
	@Autowired
	private VistaRecursosxDiadeContingRepository vistaRecursosxDiadeContingRepository;
	@Autowired
	private VistaCondiRecursosClavesRepository vistaCondiRecursosClavesRepository;
	@Autowired
	private VistaCondiPersonasClavesRepository vistaCondiPersonasClavesRepository;
	@Autowired
	private VistaPersoxDiadeContingenciaTotalesRepository vistaPersoxDiadeContingenciaTotalesRepository;*/
	
	
		
	
	/*@Override
	public List<DetalleUnidadResponseDto> getUnidades() {
		DetalleUnidadResponseDto detalleUnidad;
		Proceso proceso;
		Set<Proceso> procesos=new HashSet<>();
		List<DetalleUnidadResponseDto> listaUnidades = new ArrayList<>();
		Optional<Parametros> deEstatus;
		Optional<Parametros> deClasificacion;
		int id_estatus;
		String estatus;
		String boton;
		int id_tipoClasificacion;
		String tipoClasificacion;
		List<Unidad> unidades = StreamSupport
                .stream(unidadRepository.findAll().spliterator(), false)
                .collect(Collectors.toList());
		
		unidades.sort(Comparator.comparing(Unidad::getNombre));
		
		for (Unidad unidad: unidades) {
			deEstatus=parametrosRepository.findByIdtablaAndValor("ESTATUS", String.valueOf(unidad.getActivo()));
			id_estatus=Integer.parseInt(deEstatus.get().getValor());
			estatus=deEstatus.get().getNombre();
			 if (id_estatus==1)
		        	boton="Desactivar";
		        else
		        	boton="Activar";
	        deClasificacion=parametrosRepository.findByIdtablaAndValor("TIPOCLASIFICACION", String.valueOf(unidad.getTipoClasificacion()));
	        id_tipoClasificacion=Integer.parseInt(deClasificacion.get().getValor());
	        tipoClasificacion=deClasificacion.get().getNombre();
	        procesos=unidad.getProcesos();
	     
			detalleUnidad = new DetalleUnidadResponseDto(unidad.getIdUnidad(),unidad.getCdUnidad(),unidad.getNombre(),unidad.getDescripcion(),
			id_estatus,estatus,boton,id_tipoClasificacion,tipoClasificacion,unidad.getUsuario(),unidad.getFechaRegistro(),
			unidad.getFechaModificacion(),unidad.getUnidadAdscripcion()!=null? unidad.getUnidadAdscripcion().getIdUnidadAdscripcion():null,
			unidad.getUnidadAdscripcion()!=null? unidad.getUnidadAdscripcion().getNombre(): null,
			unidad.getUbicacionesTi().getId_ubicacion(),
			unidad.getUbicacionesTi().getNombre()!=null?unidad.getUbicacionesTi().getNombre():null,procesos);
			listaUnidades.add(detalleUnidad);
		}
		
		return listaUnidades;
	}*/
	
	/*@Override
	public List<Cargos> buscarCargosporUnidad(Integer idUnidad) {
		return unidadRepository.findByCargosbyUnidad(idUnidad);
	}*/
	
	/* @Override
		public List<Vistatotalunidadesconevaluaciones> buscarTotalUnidadesxCampana(Long idCampana) {
			//return vistaRankigCanalesRepository.findAll();
			return vistatotalunidadesconevaluacionesRepository.findByIdCampana(idCampana);
	}
	 
	 @Override
		public List<VistaResumenPorUnidad> buscarResumenunidadxCampana(Long idCampana) {
			//return vistaRankigCanalesRepository.findAll();
			return vistaResumenPorUnidadRepository.findByIdCampana(idCampana);
    }
	 
	 @Override
		public List<VistaPersonalxDiadeContingencia> buscarpersContingxUnidad(Long idCampana) {
			//return vistaRankigCanalesRepository.findAll();
			return vistaPersonalxDiadeContingenciaRepository.findByIdCampana(idCampana);
	  }
	 
	 @Override
		public List<VistaPersoxDiadeContingenciaTotales> buscarpersContingxUnidadTotales(Long idCampana) {
			//return vistaRankigCanalesRepository.findAll();
			return vistaPersoxDiadeContingenciaTotalesRepository.findByIdCampana(idCampana);
	  }
	 
	 @Override
		public List<VistaRecursosxDiadeConting> buscarRecursostotales() {
			return vistaRecursosxDiadeContingRepository.findAll();
	}
	 
	 @Override
		public List<VistaCondiPersonasClaves> buscarPerClaves() {
			return vistaCondiPersonasClavesRepository.findAll();
	}
	 
	 @Override
		public List<VistaCondiRecursosClaves> buscarRecursosClaves() {
			return vistaCondiRecursosClavesRepository.findAll();
	}*/
	 
	
	 
	/*@Override
	public DetalleUnidadResponseDto getUnidadById(Integer idUnidad) {
		Unidad unidad = getUnidad(idUnidad);
		Proceso proceso;
		Set<Proceso> procesos=new HashSet<>();
		int id_estatus;
		String boton;
        Optional<Parametros> deEstatus=parametrosRepository.findByIdtablaAndValor("ESTATUS", String.valueOf(unidad.getActivo()));
        id_estatus=Integer.parseInt(deEstatus.get().getValor());
        if (id_estatus==1)
        	boton="Desactivar";
        else
        	boton="Activar";
        String estatus=deEstatus.get().getNombre();
        int id_tipoClasificacion;
        Optional<Parametros> deClasificacion=parametrosRepository.findByIdtablaAndValor("TIPOCLASIFICACION", String.valueOf(unidad.getTipoClasificacion()));
        id_tipoClasificacion=Integer.parseInt(deClasificacion.get().getValor());
        String tipoClasificacion=deClasificacion.get().getNombre();
        procesos=unidad.getProcesos();
       
        DetalleUnidadResponseDto detalleUnidadResponseDto=new DetalleUnidadResponseDto(unidad.getIdUnidad(),unidad.getCdUnidad(),unidad.getNombre(),unidad.getDescripcion(),
				id_estatus,estatus,boton,id_tipoClasificacion,tipoClasificacion,unidad.getUsuario(),unidad.getFechaRegistro(),unidad.getFechaModificacion(),unidad.getUnidadAdscripcion()!=null? unidad.getUnidadAdscripcion().getIdUnidadAdscripcion():null,unidad.getUnidadAdscripcion()!=null? unidad.getUnidadAdscripcion().getNombre(): null,unidad.getUbicacionesTi().getId_ubicacion(),unidad.getUbicacionesTi().getNombre()!=null?unidad.getUbicacionesTi().getNombre():null,procesos);

        return detalleUnidadResponseDto;
	}*/

	/*@Override
	public Unidad getUnidad(Integer idUnidad) {
		 Unidad unidad = unidadRepository.findById(idUnidad).orElseThrow(() ->
         		new IllegalArgumentException("No se encuentra la unidad con id: " + idUnidad));
		 return unidad;
	}*/
	
	@Override
	public Optional<Unidad> getByNombre(String nombre){
        return unidadRepository.findByNombre(nombre);
    }
	
	public Optional<Unidad> getByCdUnidad(String cdUnidad){
        return unidadRepository.findByCdUnidad(cdUnidad);
    }
	
/*	@Transactional
    @Override
	public UnidadResponseDto addUnidad(UnidadRequestDto unidadRequestDto) {
        Unidad unidad = convertirDTOAEntidad(unidadRequestDto);    
        return Mapper.unidadtoUnidadResponseDto(unidadRepository.save(unidad));
	}*/
	
	/*@Transactional
    @Override
	public UnidadResponseDto editUnidad(UnidadRequestDto unidadRequestDto) {
        Unidad unidad = convertirDTOAEntidad(unidadRequestDto);    
        return Mapper.unidadtoUnidadResponseDto(unidadRepository.save(unidad));
	}*/
	
	/*public Unidad convertirDTOAEntidad(UnidadRequestDto unidadRequestDto) {
        Unidad unidad = new Unidad();
        unidad.setCdUnidad(unidadRequestDto.getCdUnidad());
        unidad.setNombre(unidadRequestDto.getNombre());
        unidad.setDescripcion(unidadRequestDto.getDescripcion());
        unidad.setActivo(unidadRequestDto.getActivo());
        unidad.setTipoClasificacion(unidadRequestDto.getTipoClasificacion());
        unidad.setFechaRegistro(unidadRequestDto.getFechaRegistro());
        unidad.setFechaModificacion(unidadRequestDto.getFechaModificacion());
        unidad.setUsuario(unidadRequestDto.getUsuario());
        if (unidadRequestDto.getProcesos()!=null){
        	
        	unidad.setProcesos(unidadRequestDto.getProcesos());
        }
        
    

        if (unidadRequestDto.getId_ubicacion()!= 0) {
            UbicacionesTi ubicacionesTi = UbicacionesTiRepository.findById(unidadRequestDto.getId_ubicacion()).orElseThrow(
                    () -> new RuntimeException("Ubicación no encontrada"));
            unidad.setUbicacionesTi(ubicacionesTi);
        }
        
        return unidad;
    }*/

	@Override
	public boolean existsByNombre(UnidadRequestDto unidadRequestDto) {
		return unidadRepository.existsByNombre(unidadRequestDto.getNombre());
	}
	
	@Override
	public boolean existsByCdUnidad(String cdUnidad) {
		return unidadRepository.existsByCdUnidad(cdUnidad);
	}
	
	public boolean existsById(Integer idUnidad){
        return unidadRepository.existsById(idUnidad);
    }
	@Override
	public Optional<Unidad> findById(Integer idUnidad) {
		// TODO Auto-generated method stub
		return unidadRepository.findById(idUnidad);
	}
	
	public Optional<Unidad> getOne(Integer idUnidad){
        return unidadRepository.findById(idUnidad);
    }
	
	@Override
	public void save(Unidad unidad) {
		unidadRepository.save(unidad);
	  
		
	}
	
	@Override
	public boolean existsByNombre(String nombre) {
		 return unidadRepository.existsByNombre(nombre);
	}
	
	@Override
	public long countProcesosPorUnidad(Integer idUnidad) {
		return 0;
	}
	
	/*@Override
	public List<ProcesoResponseDto> getProcesos(Integer idUnidad) {
		Unidad unidades = unidadRepository.findById(idUnidad).orElseThrow(() ->new IllegalArgumentException("No se encuentra la unidad con id: " + idUnidad));
		Set<Proceso> procesos = unidades.getProcesos();
		ProcesoResponseDto procesoResponseDto= new ProcesoResponseDto();
		List<ProcesoResponseDto> procesoResponseDtoList= new ArrayList<>();
		Optional<Parametros> deProcesoRemoto;
		Optional<Parametros> deTipoProceso;
		Optional<Parametros> deActivo;
		Optional<Parametros> deDisponibilidad;
		
		String nombreProcesoRemoto;
		String nombreTipoProceso;
		String nombreActivo;
		String nombreDisponibilidad;
		for(Proceso proceso : procesos) {
			deProcesoRemoto=parametrosRepository.findByIdtablaAndValor("PROCESOREMOTO", String.valueOf(proceso.getProcesoRemoto()));
			nombreProcesoRemoto=deProcesoRemoto.get().getNombre();
			deTipoProceso=parametrosRepository.findByIdtablaAndValor("TIPOPROCESO", String.valueOf(proceso.getTipoProceso()));
			nombreTipoProceso=deTipoProceso.get().getNombre();
			deActivo=parametrosRepository.findByIdtablaAndValor("ESTATUS", String.valueOf(proceso.getActivo()));
			nombreActivo=deActivo.get().getNombre();
			
			
			procesoResponseDto= new ProcesoResponseDto(
					proceso.getId_procesamiento(),
					proceso.getIdProceso(),
					proceso.getNombre(),
					proceso.getDescripcion(),
					proceso.getProcesoRemoto(),
					nombreProcesoRemoto,
					proceso.getTipoProceso(), 
					nombreTipoProceso, 
					proceso.getActivo(),
					nombreActivo, 
					proceso.getUsuario(),
					proceso.getFechaRegistro(),
					proceso.getFechaModificacion(),
					proceso.getLineaOperacion().getId_lineaoperacion(),
					proceso.getLineaOperacion().getNombre());
			
			procesoResponseDtoList.add(procesoResponseDto);
		}
		return procesoResponseDtoList;
	}*/
	
	@Override
	public List<Unidad> getByUnidadActivo() {
		// TODO Auto-generated method stub
		return unidadRepository.findByUnidadActivo();
	}
	
	/* @Override
		public List<VistaUnidadesAll> buscarUnidadesAll() {
			return vistaUnidadesAllRepository.findAll();
		}*/
	
	/*@Override
	public List<ProcesoResponseDto> getProcesosActivos(Integer idUnidad) {
		Unidad unidades = unidadRepository.findById(idUnidad).orElseThrow(() ->new IllegalArgumentException("No se encuentra la unidad con id: " + idUnidad));
		Set<Proceso> procesos = unidades.getProcesos();
		ProcesoResponseDto procesoResponseDto= new ProcesoResponseDto();
		List<ProcesoResponseDto> procesoResponseDtoList= new ArrayList<>();
		Optional<Parametros> deProcesoRemoto;
		Optional<Parametros> deTipoProceso;
		Optional<Parametros> deActivo;
		Optional<Parametros> deDisponibilidad;
		
		String nombreProcesoRemoto;
		String nombreTipoProceso;
		String nombreActivo;
		String nombreDisponibilidad;
		for(Proceso proceso : procesos) {
			if (proceso.getActivo()==1) {
			deProcesoRemoto=parametrosRepository.findByIdtablaAndValor("PROCESOREMOTO", String.valueOf(proceso.getProcesoRemoto()));
			nombreProcesoRemoto=deProcesoRemoto.get().getNombre();
			deTipoProceso=parametrosRepository.findByIdtablaAndValor("TIPOPROCESO", String.valueOf(proceso.getTipoProceso()));
			nombreTipoProceso=deTipoProceso.get().getNombre();
			deActivo=parametrosRepository.findByIdtablaAndValor("ESTATUS", String.valueOf(proceso.getActivo()));
			nombreActivo=deActivo.get().getNombre();
		
			
			procesoResponseDto= new ProcesoResponseDto(
					proceso.getId_procesamiento(),
					proceso.getIdProceso(),
					proceso.getNombre(),
					proceso.getDescripcion(),
					proceso.getProcesoRemoto(),
					nombreProcesoRemoto,
					proceso.getTipoProceso(), 
					nombreTipoProceso, 
					proceso.getActivo(),
					nombreActivo, 
					proceso.getUsuario(),
					proceso.getFechaRegistro(),
					proceso.getFechaModificacion(),
					proceso.getLineaOperacion().getId_lineaoperacion(),
					proceso.getLineaOperacion().getNombre());
			
			procesoResponseDtoList.add(procesoResponseDto);
			}
		}
		return procesoResponseDtoList;
	}*/
}
