package com.dacrt.SBIABackend.service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import com.dacrt.SBIABackend.dto.Channelresume2Dto;
import com.dacrt.SBIABackend.dto.ChannelresumeDto;
import com.dacrt.SBIABackend.dto.ContinuitySection2Dto;
import com.dacrt.SBIABackend.dto.LabelItemDtoReport;
import com.dacrt.SBIABackend.dto.LabelValueDtoReport;
import com.dacrt.SBIABackend.dto.ResumenBiaContentSection1;
import com.dacrt.SBIABackend.dto.ResumenBiaRtoDto;
import com.dacrt.SBIABackend.dto.ResumenBiaSection1;
import com.dacrt.SBIABackend.dto.ResumenBiaTimeTableDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;

@Service
public class BiaresumeproSection1Service {
	Logger logger = LoggerFactory.getLogger(BiaresumeproSection1Service.class);
	@PersistenceContext
	private EntityManager entityManager;
	
	
	 public ResumenBiaSection1 getResumeBiaProcesos(int idcampana,int idunidad,int idprocesos) {
			
			ResumenBiaContentSection1 detalleResumenBiaContentSection1 = new ResumenBiaContentSection1();
			ResumenBiaTimeTableDto detalleResumenBiaTimeTableDto = new ResumenBiaTimeTableDto();
			ResumenBiaTimeTableDto detalleResumenBiaTimeTableDto2 = new ResumenBiaTimeTableDto();
			ResumenBiaSection1 detalleResumenBiaSection1 = new ResumenBiaSection1();
			List<ResumenBiaTimeTableDto> listadoResumenBiaTimeTableDto=new ArrayList();
			ResumenBiaRtoDto detalleResumenBiaRtoDto = new ResumenBiaRtoDto();
			StatusDto2 detalleRTO = new StatusDto2();
			RespuestaDto respuesta = new RespuestaDto("", false);
			HttpStatus estatus = HttpStatus.FORBIDDEN;
			//JSONObject jsonObject;
	try {
			String SentenciaBase = " SELECT "
					+ "   ei.rtoqty,eperi.timetable,CAST(ei.evalprocrtoperiodpar AS INTEGER), "
					+ "	CASE   "
					+ "   WHEN ei.evalprocrtoperiodpar= '1' THEN 'Días' "
					+ "   WHEN ei.evalprocrtoperiodpar= '2'  THEN 'Horas' "
					+ "   WHEN ei.evalprocrtoperiodpar= '3'  THEN 'Minutos' "
					+ "	END AS tiporto, "
					+ "  CASE   "
					+ "   WHEN ei.evalprocrtoperiodpar= '1' THEN ei.rtoqty/1440 "
					+ "   WHEN ei.evalprocrtoperiodpar= '2'  THEN ei.rtoqty/60  "
					+ "   WHEN ei.evalprocrtoperiodpar= '3'  THEN ei.rtoqty/1 "
					+ "  END AS rtocalculado,s.offer_full, "
					+ "	CASE   "
					+ "   WHEN s.offer_full= 1 THEN TRUE "
					+ "   else FALSE "
					+ "END AS ofertaserv "
					+ "FROM "
					+ "    main.evalprocesses ep "
					+ "	  INNER join main.evalprocimpacts ei on ep.id=ei.evalprocessid "
					+ "    LEFT JOIN main.evalprocperiods eperi ON eperi.evalprocessid = ep.id "
					+ "    INNER JOIN main.unitprocesses up ON ep.unitprocessid = up.id "
					+ "	INNER JOIN main.campaignunits cu on ep.campaignunitid = cu.id  "
					+ "    LEFT JOIN main.processserviceoffers po on up.processid = po.processid "
					+ "	LEFT JOIN main.serviceoffers s on po.serviceofferid = s.id "
					+ "WHERE "
					+ "    up.unitid =  " + idunidad 
					+ " AND up.processid =  " + idprocesos 
					+ " AND cu.campaingid = " + idcampana + " and ep.impactst = 1 ";
			
			Query query;
			 query = entityManager.createNativeQuery(SentenciaBase);
			 
			   List<Object[]> listacompleta = query.getResultList();
			   int cuantosregistros1 = listacompleta.size();
			   
			   if (cuantosregistros1>0) {
			   for (Object[] fila : listacompleta) { 
				   String jsonStringTipo = (String) fila[1]; // Recupera el JSON como String
				   if (jsonStringTipo != null) {
				       try {
				           JSONArray jsonArray = new JSONArray(jsonStringTipo); // 1. Convierte el String a JSONArray
				           
				           // 2. Itera sobre cada objeto en el array
				           for (int i = 0; i < jsonArray.length(); i++) {
				               JSONObject jsonObject = jsonArray.getJSONObject(i);
				               detalleResumenBiaTimeTableDto = new ResumenBiaTimeTableDto();
				              
				               // 3. Extrae los valores del JSONObject actual
				               // Nota: Aquí los campos son 'name', 'from', 'to', no 'dsc' o 'value'
				               String name = jsonObject.getString("name");
				               String from = jsonObject.getString("from");
				               String to = jsonObject.getString("to");
				               detalleResumenBiaTimeTableDto.setName(name);
				               detalleResumenBiaTimeTableDto.setFrom(from);
				               detalleResumenBiaTimeTableDto.setTo(to);
				               listadoResumenBiaTimeTableDto.add(detalleResumenBiaTimeTableDto);
				               // Aquí puedes crear y añadir un nuevo objeto a tu lista
				               // Por ejemplo, si tienes una clase 'Horario':
				             //  Horario horario = new Horario(name, from, to);
				             ///  tipoProcesoList.add(horario);
				           }

				       } catch(JSONException e) {
				           System.err.println("Error al procesar JSON Array: " + e.getMessage());
				           // Manejar el error
				       }
				   }
				   
				   detalleResumenBiaContentSection1.setOffer_full((boolean) fila[6]);
				   detalleResumenBiaContentSection1.setTimetable(listadoResumenBiaTimeTableDto);
				   detalleRTO = new StatusDto2();
				   detalleResumenBiaRtoDto = new ResumenBiaRtoDto();
				   
				   detalleRTO.setId((int) fila[2]);
				   detalleRTO.setName((String) fila[3]);
				   detalleResumenBiaRtoDto.setQty((int) fila[4]);
				   detalleResumenBiaRtoDto.setPeriodpar(detalleRTO);
				   detalleResumenBiaContentSection1.setRto(detalleResumenBiaRtoDto);
				   
			   }
	    }  else { // for
	    	 detalleRTO = new StatusDto2();
	    	 listadoResumenBiaTimeTableDto=new ArrayList();
	    	 listadoResumenBiaTimeTableDto.add(detalleResumenBiaTimeTableDto);
	    	// detalleRTO.setId();
			   detalleRTO.setName("");
			detalleResumenBiaRtoDto.setPeriodpar(detalleRTO);
			detalleResumenBiaContentSection1.setRto(detalleResumenBiaRtoDto);
	    	
	        
	        // Y aquí debes asegurarte de no establecer el campo 'timetable' con una lista vacía
	        detalleResumenBiaContentSection1.setTimetable(new ArrayList<>());
	    }	
			detalleResumenBiaSection1.setTitle("Procesos");
			detalleResumenBiaSection1.setContent(detalleResumenBiaContentSection1);
			
		
				return detalleResumenBiaSection1;	    	 
	    }catch (Exception e) {
			// Manejo de excepciones
			respuesta = new RespuestaDto("Error interno del servidor", false);
			estatus = HttpStatus.INTERNAL_SERVER_ERROR;
			return detalleResumenBiaSection1;
		} finally {
			if (entityManager != null && entityManager.isOpen()) {
				entityManager.close();
			}
		}					
					
	 	}


}
