package com.ejie.ab79.control.propuestaSancion;

import java.util.Calendar;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.model.propuestaSancion.DerechosPropuesta;
import com.ejie.ab79.model.propuestaSancion.InfraccionesPropuesta;
import com.ejie.ab79.service.propuestaSancion.PropuestaSancionInfraccionesService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;

/**
 * 
 * PropuestaSancionInfraccionesController
 * 
 *  
 *
 */

@Controller
@SessionAttributes("usuario")
@RequestMapping(value = "propuestaSancionInfracciones")
public class PropuestaSancionInfraccionesController {

	private static final Logger logger = LoggerFactory.getLogger(PropuestaSancionInfraccionesController.class);
	@Autowired
	private PropuestaSancionInfraccionesService propuestaSancionInfraccionesService;
	@Autowired
	private PropuestaSancionDerechosController propuestaSancionDerechosController;

	/*
	 * redireccion a la modal para seleccionar una inspeccion y sus derechos.
	 */
	/**
	 * 
	 * @return String
	 */
	@RequestMapping(value = "/modalInfraccion", method = RequestMethod.GET)
	public String modalInfraccion() {
		return "modalInfraccion";
	}

	@RequestMapping(value = "/{idRelArtInfProSan}", method = RequestMethod.GET)
	public @ResponseBody InfraccionesPropuesta get(@PathVariable Integer idRelArtInfProSan) {
		InfraccionesPropuesta infraccionPropuesta = new InfraccionesPropuesta();
		infraccionPropuesta.setIdRelArtInfProSan(idRelArtInfProSan);
		infraccionPropuesta = this.propuestaSancionInfraccionesService.find(infraccionPropuesta);
		PropuestaSancionInfraccionesController.logger.info("[GET - findBy_PK] : Obtener InfraccionesPropuesta por PK");
		return infraccionPropuesta;
	}

	/**
	 * Operacion CRUD Create. Creacion de un nuevo registro a partir del bean
	 * indicado.
	 *
	 * @param infraccionesPropuesta
	 *            InfraccionesPropuesta Bean que contiene la informacion con la
	 *            que se va a crear el nuevo registro.
	 * @param usuario
	 *            Usuario
	 * @return RelArtInfSan Bean resultante del proceso de creacion.
	 */
	@RequestMapping(method = RequestMethod.POST)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody InfraccionesPropuesta add(@RequestBody InfraccionesPropuesta infraccionesPropuesta,
			@ModelAttribute(value = "usuario") Usuario usuario) {

		Calendar cal = Calendar.getInstance();
		infraccionesPropuesta.setFechaRegistro(cal.getTime());
		infraccionesPropuesta.setUsuarioRegistro(usuario.getUsuario());

		InfraccionesPropuesta infraccionesPropuestaAux = this.propuestaSancionInfraccionesService
				.add(infraccionesPropuesta);
		PropuestaSancionInfraccionesController.logger.info("[POST] : Infracción insertado correctamente");
		return infraccionesPropuestaAux;
	}

	@RequestMapping(method = RequestMethod.PUT)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody InfraccionesPropuesta edit(@RequestBody InfraccionesPropuesta infraccionesPropuesta,
			@ModelAttribute(value = "usuario") Usuario usuario) {

		Calendar cal = Calendar.getInstance();
		infraccionesPropuesta.setFechaUltmodificacion(cal.getTime());
		infraccionesPropuesta.setUsuarioUltmodificacion(usuario.getUsuario());

		InfraccionesPropuesta infraccionesPropuestaAux = this.propuestaSancionInfraccionesService
				.update(infraccionesPropuesta);
		PropuestaSancionInfraccionesController.logger.info("[POST] : Infracción insertado correctamente");
		return infraccionesPropuestaAux;
	}

	/**
	 * Metodo que devuelve una lista de infracciones aplicando un filtro
	 * 
	 * @param filterInfracciones
	 *            InfraccionesPropuesta
	 * @param tableRequestDto
	 *            TableRequestDto
	 * 
	 * @return List<InfraccionesPropuesta>
	 */

	public List<InfraccionesPropuesta> getAll(InfraccionesPropuesta filterInfracciones,
			TableRequestDto tableRequestDto) {
		return this.propuestaSancionInfraccionesService.findAllInfraccionesPropuesta(filterInfracciones,
				tableRequestDto);
	}

	/**
	 * Metodo de presentacion del RUP_TABLE.
	 * 
	 * @param model
	 *            Model
	 * @return String
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getFormEdit(Model model) {
		PropuestaSancionInfraccionesController.logger.info("[GET - View] : infracciones");
		return "propuestaSancion";
	}

	@RequestMapping(value = "/eliminarInfraccion/{idRelArtInfProSan}", method = RequestMethod.GET)
	public @ResponseBody void eliminarInfraccion(@PathVariable int idRelArtInfProSan) {

		DerechosPropuesta filterDerechos = new DerechosPropuesta();
		filterDerechos.setIdDerInfraccion(idRelArtInfProSan);

		InfraccionesPropuesta filterInfraccion = new InfraccionesPropuesta();
		filterInfraccion.setIdRelArtInfProSan(idRelArtInfProSan);

		if (propuestaSancionDerechosController.findAllCount(filterDerechos) > 0)
			propuestaSancionDerechosController.eliminarDerechos(filterDerechos);
		propuestaSancionInfraccionesService.remove(filterInfraccion);

	}

	/**
	 * 
	 * @param filterInfracciones
	 *            InfraccionesPropuesta
	 * @param tableRequestDto
	 *            TableRequestDto
	 * 
	 * @return TableResponseDto<InfraccionesPropuesta>
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<InfraccionesPropuesta> filter(
			@RequestJsonBody(param = "filter") InfraccionesPropuesta filterInfracciones,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		PropuestaSancionInfraccionesController.logger.info("[POST - filter] : Obtener infracciones");
		return this.propuestaSancionInfraccionesService.filter(filterInfracciones, tableRequestDto, false);
	}

	/**
	 * 
	 * @param filterInfracciones
	 *            InfraccionesPropuesta
	 * @param tableRequestDto
	 *            TableRequestDto
	 * 
	 * @return TableResponseDto<InfraccionesPropuesta>
	 */
	@RequestMapping(value = "/comprobarInfracciones/{idPropuestaSancion}", method = RequestMethod.GET)
	public @ResponseBody Long comprobarInfracciones(@PathVariable("idPropuestaSancion") Integer idPropuestaSancion) {
		PropuestaSancionInfraccionesController.logger.info("[POST - filter] : Comprobar Infracciones");

		InfraccionesPropuesta filterInfracciones = new InfraccionesPropuesta();
		filterInfracciones.setIdPropuestaSancion(idPropuestaSancion);

		return this.propuestaSancionInfraccionesService.findInfraccionesDerechosCount(filterInfracciones);
	}

}// class