package com.dacrt.SBIABackend.controler;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Optional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.dto.AppResumeDRPDto;
import com.dacrt.SBIABackend.dto.BcpstrategiesDto;
import com.dacrt.SBIABackend.dto.BodyUnitResumeBCPDto;
import com.dacrt.SBIABackend.dto.BodyUnitResumeDRPDto;
import com.dacrt.SBIABackend.dto.ContentSection1Dto;
import com.dacrt.SBIABackend.dto.ContinuityBodySectionDto;
import com.dacrt.SBIABackend.dto.ContinuityHeaderDto;
import com.dacrt.SBIABackend.dto.ContinuitySection1Dto;
import com.dacrt.SBIABackend.dto.ContinuitySection2Dto;
import com.dacrt.SBIABackend.dto.ContinuitySection3Dto;
import com.dacrt.SBIABackend.dto.DrpstrategiesDto;
import com.dacrt.SBIABackend.dto.FooterUnitResumeBCPDto;
import com.dacrt.SBIABackend.dto.HeaderUnitResumeBCPDto;
import com.dacrt.SBIABackend.dto.HeaderUnitResumeBCPDto2;
import com.dacrt.SBIABackend.dto.InventoryDto;
import com.dacrt.SBIABackend.dto.LabelItemDtoReport2;
import com.dacrt.SBIABackend.dto.LabelValueDtoReport2;
import com.dacrt.SBIABackend.dto.PrivilegiesDto;
import com.dacrt.SBIABackend.dto.RecuperationgapsDto;
import com.dacrt.SBIABackend.dto.ReportDateDto;
import com.dacrt.SBIABackend.dto.ResumenDRPResponseDto;
import com.dacrt.SBIABackend.dto.ResumenUnidadBCPResponseDto;
import com.dacrt.SBIABackend.dto.Section1UnitResumenBCPDto;
import com.dacrt.SBIABackend.dto.Section2UnitResumenBCPDto;
import com.dacrt.SBIABackend.dto.Section3UnitResumenBCPDto;
import com.dacrt.SBIABackend.dto.Section4UnitResumenBCPDto;
import com.dacrt.SBIABackend.dto.UnitResumeBCPDto;
import com.dacrt.SBIABackend.dto.responseDto.ContinuityResponseDto;
import com.dacrt.SBIABackend.entity.Positions;
import com.dacrt.SBIABackend.entity.Units;
import com.dacrt.SBIABackend.entity.Workers;
import com.dacrt.SBIABackend.repository.CampaignsRepository;
import com.dacrt.SBIABackend.repository.PositionsRepository;
import com.dacrt.SBIABackend.repository.UnitsRepository;
import com.dacrt.SBIABackend.repository.WorkersRepository;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;
import com.dacrt.SBIABackend.security.entity.Roles;
import com.dacrt.SBIABackend.security.entity.Users;
import com.dacrt.SBIABackend.security.repository.AuditRepository;
import com.dacrt.SBIABackend.security.repository.ParamsRepository;
import com.dacrt.SBIABackend.security.repository.RolesPrivilegesRepository;
import com.dacrt.SBIABackend.security.repository.UsersRepository;
import com.dacrt.SBIABackend.security.service.MenuService;
import com.dacrt.SBIABackend.security.service.ParamsService;
import com.dacrt.SBIABackend.security.service.SecurityService;
import com.dacrt.SBIABackend.security.service.UsersService;
import com.dacrt.SBIABackend.service.AppteststatusService;
import com.dacrt.SBIABackend.service.BcpcoverageService;
import com.dacrt.SBIABackend.service.BcpstrategiesService;
import com.dacrt.SBIABackend.service.Section1unitresumebcpService;
import com.dacrt.SBIABackend.service.Section2unitresumebcpService;
import com.dacrt.SBIABackend.service.Section3unitresumebcpService;
import com.dacrt.SBIABackend.service.Section4unitresumebcpService;
import com.dacrt.SBIABackend.service.ContinuitySection2Service;
import com.dacrt.SBIABackend.service.ContinuitySection3Service;
import com.dacrt.SBIABackend.service.DrpcoverageService;
import com.dacrt.SBIABackend.service.DrpstrategiesService;
import com.dacrt.SBIABackend.service.ImpactReportSection1Service;
import com.dacrt.SBIABackend.service.ImpactReportSection3Service;
import com.dacrt.SBIABackend.service.ImpactReportSection4AppsService;
import com.dacrt.SBIABackend.service.ImpactReportSection5Service;
import com.dacrt.SBIABackend.service.ImpactReportSection6Service;
import com.dacrt.SBIABackend.service.InventoryService;
import com.dacrt.SBIABackend.service.PriorityunitresumedrpService;
import com.dacrt.SBIABackend.service.RecoveryexpectationService;
import com.dacrt.SBIABackend.service.RecoveryprocessesService;
import com.dacrt.SBIABackend.service.RecuperationgapsService;
import com.dacrt.SBIABackend.service.UnitsService;

@RestController
//@RequestMapping("/units")   
@CrossOrigin(origins = "*")
public class ReporteResumenUnidadesBCPController {
	@Autowired
	private ParamsRepository paramsRepository;

	@Autowired
	private UsersRepository usersRepository;
	
	@Autowired
	private AuditRepository auditRepository;
	
	@Autowired
	private WorkersRepository workersRepository;
	
	@Autowired
	private UnitsRepository unitsRepository;
	
	@Autowired
	private PositionsRepository positionsRepository;

	@Autowired
	UsersService usersService;
	
	@Autowired
	MenuService menuService;

	@Autowired
	SecurityService securityService;

	@Autowired
	ParamsService paramsService;

	@Autowired
	UnitsService unitsService;
	
	@Autowired
	Section1unitresumebcpService section1unitresumebcpService;
	
	@Autowired
	Section2unitresumebcpService section2unitresumebcpService;
	
	@Autowired
	Section3unitresumebcpService section3unitresumebcpService;
	
	@Autowired
	Section4unitresumebcpService section4unitresumebcpService;

	@Autowired
	PriorityunitresumedrpService priorityunitresumedrpService;
	
	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;
	
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	@Value("${customer}")
	private String client;

	
	@PersistenceContext
	private EntityManager entityManager;

	@Value("${spring.datasource.url}")
	private String conexion;

	@Value("${spring.datasource.username}")
	private String userbd;

	@Value("${spring.datasource.password}")
	private String passbd;
	
	@PostMapping("/reports/priorityunitresumebcp")
	public ResponseEntity<?> reportBCP(HttpServletRequest request, @RequestBody UnitResumeBCPDto unit)
			throws ParseException {
		
		/*********************/
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		PrivilegiesDto privileges= new PrivilegiesDto();
		String contentIn = "";
        int idrol;
	    String sessionid = request.getHeader("Authorization");
	    sessionid = sessionid.substring(7);
	    String Cargo="";
	    boolean tieneViewDRP;
		   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
	    

	    if (sessionid==null) {
			String var = "";
			boolean bloked = false;
			RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
			respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Sesión expirada o inválida");
			//Error 400
			return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
		} else   {
	     int rolisvalid = 0;
	     Roles roles = encontreSessionUsuario.get().getRolid();
	     idrol = roles.getId();
         rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 550);
         
		if (rolisvalid == 0) {
			respuesta.setMsg("No tiene los Privilegios");
			estatus = HttpStatus.FORBIDDEN;
			return new ResponseEntity(respuesta, estatus);
		   }
	
		}
	    
	    tieneViewDRP = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 314);
		// declaracion de los dto//
	    HeaderUnitResumeBCPDto2 header = new HeaderUnitResumeBCPDto2();
	   // HeaderUnitResumeBCPDto2
	    FooterUnitResumeBCPDto footer = new FooterUnitResumeBCPDto();
	    header.setCustomer(client);
	    header.setTitle("Resumen de Unidades por Prioridad y Concentración Dependencias");
	    contentIn = unit.getContent();
	    
	    if (contentIn != null && contentIn != "") {
			menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
		}
	    
	    Optional <Units> unidadselec = unitsRepository.findById(unit.getUnitid());
	    
	    
	    try {
	    	boolean empleado = workersRepository.existsById(encontreSessionUsuario.get().getWorkerid().getId());
	    	
	    	if (empleado) {
	    	    Optional <Workers> worker = workersRepository.findById(encontreSessionUsuario.get().getWorkerid().getId());
	    	    int CargoInteger = worker.get().getPositionunitid().getPositionid();
	    	    Positions objPosition = positionsRepository.getById(CargoInteger);
	    	    Cargo = objPosition.getName();
	    	}
	    	
	       } catch (Exception e) { 
	    	  Cargo = "Sin Cargo";
	    	  
	      }
	    
	    
	    header.setUser(encontreSessionUsuario.get().getName());
	    header.setPosition(Cargo);
	    header.setUnitname(unidadselec.get().getName());
	    footer.setFooter("");
	    ResumenUnidadBCPResponseDto resp = new ResumenUnidadBCPResponseDto();
	    
	    
		Section1UnitResumenBCPDto listadoSection1 = new Section1UnitResumenBCPDto();
		Section2UnitResumenBCPDto listadoSection2 = new Section2UnitResumenBCPDto();
		Section3UnitResumenBCPDto listadoSection3 = new Section3UnitResumenBCPDto();
		Section4UnitResumenBCPDto listadoSection4 = new Section4UnitResumenBCPDto();
		
		BodyUnitResumeBCPDto body = new BodyUnitResumeBCPDto();
		// Lamada a los servicios de cada seccion del reporte
		listadoSection1 = section1unitresumebcpService.getSection1Unitresumebcp(unit.getUnitid());
		listadoSection2 = section2unitresumebcpService.getSection2Unitresumebcp(unit.getUnitid());
		listadoSection3 = section3unitresumebcpService.getSection3Unitresumebcp(unit.getUnitid());
		listadoSection4 = section4unitresumebcpService.getSection4Unitresumebcp(unit.getUnitid());
		privileges.setViewstrategiesdrp(tieneViewDRP);
		resp.setHeader(header);
		body.setSection1(listadoSection1);
		body.setSection2(listadoSection2);
		body.setSection3(listadoSection3);
		body.setSection4(listadoSection4);
		resp.setBody(body);
		resp.setFooter(footer);
		resp.setPrivileges(privileges);

		return ResponseEntity.ok(resp);

	}
	
	@PostMapping("/reports/priorityunitresumedrp")
	public ResponseEntity<?> reportDRP(HttpServletRequest request, @RequestBody AppResumeDRPDto applicationid)
			throws ParseException {
		
		/*********************/
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		String contentIn = "";
        int idrol;
        String Cargo="";
	    String sessionid = request.getHeader("Authorization");
	    sessionid = sessionid.substring(7);
		   Optional<Users> encontreSessionUsuario =usersRepository.getBySessionid(sessionid);
		   Roles roles = encontreSessionUsuario.get().getRolid();
		     idrol = roles.getId();
	    if (sessionid==null) {
			String var = "";
			boolean bloked = false;
			RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
			respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Sesión expirada o inválida");
			//Error 400
			return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
		} else   {
	     int rolisvalid = 0;
	    
         rolisvalid = auditRepository.getCantbyRolAndPrivi(encontreSessionUsuario.get().getRolid().getId(), 550);
		if (rolisvalid == 0) {
			respuesta.setMsg("No tiene los Privilegios para ejecutar el servicio");
			estatus = HttpStatus.FORBIDDEN;
			return new ResponseEntity(respuesta, estatus);
		   }
	
		}
	    
	
	  //  int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 310);
	   //validando privilegio de DRP
	    int rolisvalidDRP = auditRepository.getCantbyRolAndPrivi(idrol, 314);
	   
		if (rolisvalidDRP == 0) {
			respuesta.setMsg("No tiene el privilegio especial DRP");
			estatus = HttpStatus.FORBIDDEN;
			return new ResponseEntity(respuesta, estatus);
		   }
	    
		// declaracion de los dto//
	    //HeaderUnitResumeBCPDto header = new HeaderUnitResumeBCPDto();
	    HeaderUnitResumeBCPDto2 header = new HeaderUnitResumeBCPDto2();
	    FooterUnitResumeBCPDto footer = new FooterUnitResumeBCPDto();
	    
	    header.setCustomer(client);
	    header.setTitle("Resumen de Unidades por Prioridad y Concentración Dependencias");
	    contentIn = applicationid.getContent();
	    
	    if (contentIn != null && contentIn != "") {
			menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
		}
	    
     //  Optional <Units> unidadselec = unitsRepository.findById(unit.getUnitid());
	    
	    
	    try {
	    	boolean empleado = workersRepository.existsById(encontreSessionUsuario.get().getWorkerid().getId());
	    	
	    	if (empleado) {
	    	    Optional <Workers> worker = workersRepository.findById(encontreSessionUsuario.get().getWorkerid().getId());
	    	    int CargoInteger = worker.get().getPositionunitid().getPositionid();
	    	    Positions objPosition = positionsRepository.getById(CargoInteger);
	    	    Cargo = objPosition.getName();
	    	}
	    	
	       } catch (Exception e) { 
	    	  Cargo = "Sin Cargo";
	    	  
	      }
	    
	    
	    header.setUser(encontreSessionUsuario.get().getName());
	    header.setPosition(Cargo);
	    header.setUnitname("No Aplica");
	    footer.setFooter("");
	    ResumenDRPResponseDto resp = new ResumenDRPResponseDto();
	    
	    
		//Section1UnitResumenBCPDto listadoSection1 = new Section1UnitResumenBCPDto();
		//Section2UnitResumenBCPDto listadoSection2 = new Section2UnitResumenBCPDto();
		//Section3UnitResumenBCPDto listadoSection3 = new Section3UnitResumenBCPDto();
	    BodyUnitResumeDRPDto body = new BodyUnitResumeDRPDto();
		Section4UnitResumenBCPDto listadoSection4 = new Section4UnitResumenBCPDto();
		
	//	BodyUnitResumeBCPDto body = new BodyUnitResumeBCPDto();
		
		// Lamada a los servicios de cada seccion del reporte
		//listadoSection1 = section1unitresumebcpService.getSection1Unitresumebcp(applicationid.getApplicationid());
		//listadoSection2 = section2unitresumebcpService.getSection2Unitresumebcp(applicationid.getApplicationid());
		//listadoSection3 = section3unitresumebcpService.getSection3Unitresumebcp(applicationid.getApplicationid());
		listadoSection4 = priorityunitresumedrpService.getSection1Unitresumedrp(applicationid.getApplicationid());

		resp.setHeader(header);
		//body.setSection1(listadoSection1);
		//body.setSection2(listadoSection2);
		//body.setSection3(listadoSection3);
		body.setSection1(listadoSection4);
		resp.setBody(body);
		resp.setFooter(footer);

		return ResponseEntity.ok(resp);

	}
	
}
