package com.ejie.ab79.control.inspecciones;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
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.RequestParam;
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.comun.Constantes;
import com.ejie.ab79.model.RelCamDoc;
import com.ejie.ab79.model.AB63.EstablecimientosRegistrados;
import com.ejie.ab79.model.inspecciones.CampainasInspeccion;
import com.ejie.ab79.model.procedimientos.Direcciones;
import com.ejie.ab79.model.procedimientos.Procedimientos;
import com.ejie.ab79.service.inspecciones.CampainasInspeccionService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;

/**
 * CampainasInspeccionController  
 * 
 *  
 */

@SessionAttributes("usuario")
@Controller
@RequestMapping(value = "/campainasinspeccion")

public class CampainasInspeccionController {

	private static final Logger logger = LoggerFactory.getLogger(CampainasInspeccionController.class);

	@Autowired
	private CampainasInspeccionService campainasInspeccionService;

	@RequestMapping(value = "/{idCampaina}", method = RequestMethod.GET)
	public @ResponseBody CampainasInspeccion get(@PathVariable Integer idCampaina) {
		CampainasInspeccion campainasInspeccion = new CampainasInspeccion();
		campainasInspeccion.setIdCampaina(idCampaina);
		campainasInspeccion = this.campainasInspeccionService.find(campainasInspeccion);
		CampainasInspeccionController.logger.info("[GET - findBy_PK] : Obtener CampainasInspeccion por PK");
		return campainasInspeccion;
	}

	@RequestMapping(method = RequestMethod.GET)
	public @ResponseBody List<CampainasInspeccion> getAll(@ModelAttribute CampainasInspeccion filterCampainasInspeccion,
			HttpServletRequest request,
			@RequestParam(value = "idProcedimiento", required = false) Integer idProcedimiento) {
		CampainasInspeccionController.logger.info("[GET - find_ALL] : Obtener CampainasInspeccion por filtro");

		if(idProcedimiento != null && !idProcedimiento.equals(0)){
			
			filterCampainasInspeccion.setProcedimiento(new Procedimientos(idProcedimiento));
			
		}
		
		if (null != request.getParameter("direccion.idDireccion")
				&& !"".equals(request.getParameter("direccion.idDireccion"))) {
			filterCampainasInspeccion
					.setDireccion(new Direcciones(Integer.parseInt(request.getParameter("direccion.idDireccion"))));
		}

		return this.campainasInspeccionService.findAll(filterCampainasInspeccion, null);
	}

	@RequestMapping(method = RequestMethod.PUT)
	public @ResponseBody CampainasInspeccion edit(@RequestBody CampainasInspeccion campainasInspeccion,
			@ModelAttribute Usuario usuario) {

		Date fechaHoy = new Date();
		campainasInspeccion.setFechaUltmodificacion(fechaHoy);
		campainasInspeccion.setUsuarioUltmodificacion(usuario.getUsuario());

		CampainasInspeccion campainasInspeccionAux = this.campainasInspeccionService.update(campainasInspeccion);
		CampainasInspeccionController.logger.info("[PUT] : CampainasInspeccion actualizado correctamente");
		return campainasInspeccionAux;
	}

	@RequestMapping(method = RequestMethod.POST)
	public @ResponseBody CampainasInspeccion add(@RequestBody CampainasInspeccion campainasInspeccion,
			@ModelAttribute("usuario") Usuario usuario) {

		Date fechaHoy = new Date();
		campainasInspeccion.setFechaRegistro(fechaHoy);
		campainasInspeccion.setUsuarioRegistro(usuario.getUsuario());

		CampainasInspeccion campainasInspeccionAux = this.campainasInspeccionService.add(campainasInspeccion);
		CampainasInspeccionController.logger.info("[POST] : CampainasInspeccion insertado correctamente");
		return campainasInspeccionAux;
	}

	@RequestMapping(value = "/{idCampaina}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody CampainasInspeccion remove(@PathVariable Integer idCampaina) {
		CampainasInspeccion campainasInspeccion = new CampainasInspeccion();
		campainasInspeccion.setIdCampaina(idCampaina);
		this.campainasInspeccionService.remove(campainasInspeccion);
		CampainasInspeccionController.logger.info("[DELETE] : CampainasInspeccion borrado correctamente");
		return campainasInspeccion;
	}


	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getFormEdit(Model model) {
		CampainasInspeccionController.logger.info("[GET - View] : campainasinspeccion");

		model.addAttribute("relCamDoc", new RelCamDoc());

		return "campainasinspeccion";
	}

	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<CampainasInspeccion> filter(
			@RequestJsonBody(param = "filter") CampainasInspeccion filterCampainasInspeccion,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		CampainasInspeccionController.logger.info("[POST - filter] : Obtener CampainasInspeccions");
		return this.campainasInspeccionService.filter(filterCampainasInspeccion, tableRequestDto, false);
	}

	@RequestMapping(value = "/aniadirEstablecimiento/{idCampaina}", method = RequestMethod.POST)
	public @ResponseBody EstablecimientosRegistrados aniadirEstablecimiento(@PathVariable Integer idCampaina,
			@RequestBody EstablecimientosRegistrados establecimiento, @ModelAttribute("usuario") Usuario usuario) {

		// Obtenemos los datos de la campaña a la que vamos a asociar el
		// establecimiento
		CampainasInspeccion campaina = new CampainasInspeccion();
		campaina.setIdCampaina(idCampaina);
		campaina = this.campainasInspeccionService.find(campaina);
		establecimiento.setCampaina(campaina);
		establecimiento.setFechaRegistro(new Date());
		establecimiento.setUsuarioRegistro(usuario.getUsuario());
		this.campainasInspeccionService.aniadirEstablecimiento(establecimiento);

		return establecimiento;
	}

	@InitBinder
	private void dateBinder(WebDataBinder binder) {

		Locale locale = LocaleContextHolder.getLocale();

		// The date format to parse or output your dates
		SimpleDateFormat dateFormat = new SimpleDateFormat(Constantes.FORMATO_FECHA_ES);

		if (locale.toString().equals(Constantes.CASTELLANO)) {
			dateFormat = new SimpleDateFormat(Constantes.FORMATO_FECHA_ES);
		} else if (locale.toString().equals(Constantes.EUSKERA)) {
			dateFormat = new SimpleDateFormat(Constantes.FORMATO_FECHA_EU);
		}

		// Create a new CustomDateEditor
		CustomDateEditor editor = new CustomDateEditor(dateFormat, true);

		// Register it as custom editor for the Date type
		binder.registerCustomEditor(Date.class, editor);

	}

	/**
	 * Método que genera una hoja de excel con los resultados de búsqueda de
	 * campañas.
	 */
	@RequestMapping(value = "/exportarExcel/{sidx}/{sord}", method = RequestMethod.POST)
	public void getExcel(@ModelAttribute CampainasInspeccion filterCampainasInspeccion, @PathVariable String sidx,
			@PathVariable String sord, @ModelAttribute TableRequestDto tableRequestDto, HttpServletResponse response) {

		List<CampainasInspeccion> listaCampainas = new ArrayList<CampainasInspeccion>();
		tableRequestDto.setSidx(sidx);
		tableRequestDto.setSord(sord);

		try {

			if ("".equals(filterCampainasInspeccion.getIdentificadorCampaina())) {
				filterCampainasInspeccion.setIdentificadorCampaina(null);
			}

			listaCampainas = this.campainasInspeccionService.findAllLike(filterCampainasInspeccion, tableRequestDto,
					false);
			for (CampainasInspeccion campaina : listaCampainas) {
				campaina.setNumeroInspeccionados(
						this.campainasInspeccionService.calcularNumeroInspeccionados(campaina));
			}

			this.campainasInspeccionService.getExcel(listaCampainas, response);

		} catch (Exception e) {
			CampainasInspeccionController.logger.error(e.getMessage());
		}

	}

}
