package com.ejie.ab79.control.AB63;

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

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.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.ResponseBody;
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.AB63.EstablecimientosRegistrados;
import com.ejie.ab79.model.inspecciones.CampainasInspeccion;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.service.AB63.EstablecimientosRegistradosService;
import com.ejie.ab79.service.inspecciones.CampainasInspeccionService;
import com.ejie.ab79.service.inspecciones.InspeccionesService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;

/**
 * EstablecimientosRegistradosController  
 * 
 *  
 */

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

public class EstablecimientosRegistradosController {

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

	@Autowired
	private EstablecimientosRegistradosService establecimientosRegistradosService;

	@Autowired
	private CampainasInspeccionService campainasInspeccionService;

	@Autowired
	private InspeccionesService inspeccionesService;

	@RequestMapping(value = "/maint/{idCampaina}", method = RequestMethod.GET)
	public String getFormEdit(Model model, @PathVariable Integer idCampaina) {
		EstablecimientosRegistradosController.logger.info("[GET - View] : establecimientosregistrados");

		CampainasInspeccion campaina = new CampainasInspeccion();
		campaina.setIdCampaina(idCampaina);
		campaina = this.campainasInspeccionService.find(campaina);

		if (LocaleContextHolder.getLocale().getLanguage().equalsIgnoreCase(Constantes.EUSKERA)) {
			model.addAttribute("descripcionCampaina", campaina.getDescripcionEuskera());
		} else {
			model.addAttribute("descripcionCampaina", campaina.getDescripcionCastellano());
		}

		model.addAttribute("campaina", campaina);

		return "establecimientosregistrados";
	}

	@RequestMapping(value = "establecimientoInspeccion/{idInspeccion}", method = RequestMethod.GET)
	public String establecimientoIsnpeccion(Model model, @PathVariable Integer idInspeccion) {
		EstablecimientosRegistradosController.logger.info("[GET - View] : establecimientosregistrados");

		Inspecciones inspeccion = new Inspecciones();
		inspeccion.setIdInspeccion(idInspeccion);
		inspeccion = this.inspeccionesService.find(inspeccion);

		model.addAttribute("inspeccion", inspeccion);

		return "establecimientosregistrados";

	}

	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<EstablecimientosRegistrados> filter(
			@RequestJsonBody(param = "filter") EstablecimientosRegistrados filterEstablecimientosRegistrados,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		EstablecimientosRegistradosController.logger.info("[POST - filter] : Obtener EstablecimientosRegistradoss");
		return this.establecimientosRegistradosService.filter(filterEstablecimientosRegistrados, tableRequestDto,
				false);
	}

	@RequestMapping(value = "/asociarEstablecimientos/{idCampaina}", method = RequestMethod.POST)
	public @ResponseBody List<EstablecimientosRegistrados> asociarEstablecimientos(@PathVariable Integer idCampaina,
			@RequestBody List<EstablecimientosRegistrados> establecimientosRegistrados,
			@ModelAttribute("usuario") Usuario usuario) {
		EstablecimientosRegistradosController.logger
				.info("[POST - asociarEstablecimientos] : Asociar establecimientos a campa�as");

		Date fechaHoy = new Date();

		CampainasInspeccion campaina = new CampainasInspeccion();
		campaina.setIdCampaina(idCampaina);
		campaina = this.campainasInspeccionService.find(campaina);

		for (EstablecimientosRegistrados establecimiento : establecimientosRegistrados) {
			establecimiento.setCampaina(campaina);
			establecimiento.setFechaRegistro(fechaHoy);
			establecimiento.setUsuarioRegistro(usuario.getUsuario());
		}

		this.establecimientosRegistradosService.asociarEstablecimientos(establecimientosRegistrados);

		return establecimientosRegistrados;
	}

	@RequestMapping(value = "/asociarEstablecimientoInspeccion/{idInspeccion}", method = RequestMethod.POST)
	public @ResponseBody String asociarEstablecimientoInspeccion(@PathVariable Integer idInspeccion,
			@RequestBody EstablecimientosRegistrados establecimientoRegistrado,
			@ModelAttribute("usuario") Usuario usuario) {
		EstablecimientosRegistradosController.logger
				.info("[POST - asociarEstablecimientoInspeccion] : Asociar establecimiento a inspecci�n");

		Date fechaHoy = new Date();

		establecimientoRegistrado.setFechaRegistro(fechaHoy);

		Inspecciones inspeccion = new Inspecciones();
		inspeccion.setIdInspeccion(idInspeccion);
		inspeccion = this.inspeccionesService.find(inspeccion);

		this.establecimientosRegistradosService.asociarEstablecimientoInspeccion(establecimientoRegistrado, inspeccion,
				usuario);

		return "fichadeinspeccion/maint/" + idInspeccion;

	}

	@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 la b�squeda
	 * de establecimientos cuando entramos desde campa�as
	 */
	@RequestMapping(value = "/exportarExcel/{sidx}/{sord}/{idCampaina}", method = RequestMethod.POST)
	public void getExcel(@ModelAttribute EstablecimientosRegistrados filterEstablecimientosRegistrados,
			@PathVariable String sidx, @PathVariable String sord, @PathVariable Integer idCampaina,
			@ModelAttribute TableRequestDto tableRequestDto, HttpServletResponse response) {

		try {

			List<EstablecimientosRegistrados> listaEstablecimientos = new ArrayList<EstablecimientosRegistrados>();
			tableRequestDto.setSidx(sidx);
			tableRequestDto.setSord(sord);
			filterEstablecimientosRegistrados.setCampaina(new CampainasInspeccion(idCampaina));

			if ("".equals(filterEstablecimientosRegistrados.getIdentificadorEstablecimiento())) {
				filterEstablecimientosRegistrados.setIdentificadorEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getEstablecimiento())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getTipoEstablecimiento())) {
				filterEstablecimientosRegistrados.setTipoEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getCategoriaEstablecimiento())) {
				filterEstablecimientosRegistrados.setCategoriaEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getModalidadEstablecimiento())) {
				filterEstablecimientosRegistrados.setModalidadEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getEspecialidad())) {
				filterEstablecimientosRegistrados.setEspecialidad(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getGrupo())) {
				filterEstablecimientosRegistrados.setGrupo(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getCodigoPostal())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setCodigoPostal(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getDireccion())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setDireccion(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getNumero())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setNumero(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getEscalera())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setEscalera(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getPiso())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setPiso(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getLetra())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setLetra(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosTercero().getDocumento())) {
				filterEstablecimientosRegistrados.getDatosTercero().setDocumento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosTercero().getNombre())) {
				filterEstablecimientosRegistrados.getDatosTercero().setNombre(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosTercero().getEmail())) {
				filterEstablecimientosRegistrados.getDatosTercero().setEmail(null);
			}

			listaEstablecimientos = this.establecimientosRegistradosService
					.findAllLike(filterEstablecimientosRegistrados, tableRequestDto, false);
			this.establecimientosRegistradosService.getExcel(listaEstablecimientos, response);

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

	}

	/**
	 * M�todo que genera una hoja de excel con los resultados de la b�squeda
	 * de establecimientos cuando entramos desde inspecciones
	 */
	@RequestMapping(value = "/exportarExcel/{sidx}/{sord}", method = RequestMethod.POST)
	public void getExcelInspeccion(@ModelAttribute EstablecimientosRegistrados filterEstablecimientosRegistrados,
			@PathVariable String sidx, @PathVariable String sord, @ModelAttribute TableRequestDto tableRequestDto,
			HttpServletResponse response) {

		try {

			List<EstablecimientosRegistrados> listaEstablecimientos = new ArrayList<EstablecimientosRegistrados>();
			tableRequestDto.setSidx(sidx);
			tableRequestDto.setSord(sord);

			if ("".equals(filterEstablecimientosRegistrados.getIdentificadorEstablecimiento())) {
				filterEstablecimientosRegistrados.setIdentificadorEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getEstablecimiento())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getTipoEstablecimiento())) {
				filterEstablecimientosRegistrados.setTipoEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getCategoriaEstablecimiento())) {
				filterEstablecimientosRegistrados.setCategoriaEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getModalidadEstablecimiento())) {
				filterEstablecimientosRegistrados.setModalidadEstablecimiento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getEspecialidad())) {
				filterEstablecimientosRegistrados.setEspecialidad(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getGrupo())) {
				filterEstablecimientosRegistrados.setGrupo(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getCodigoPostal())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setCodigoPostal(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getDireccion())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setDireccion(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getNumero())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setNumero(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getEscalera())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setEscalera(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getPiso())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setPiso(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosDireccion().getLetra())) {
				filterEstablecimientosRegistrados.getDatosDireccion().setLetra(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosTercero().getDocumento())) {
				filterEstablecimientosRegistrados.getDatosTercero().setDocumento(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosTercero().getNombre())) {
				filterEstablecimientosRegistrados.getDatosTercero().setNombre(null);
			}
			if ("".equals(filterEstablecimientosRegistrados.getDatosTercero().getEmail())) {
				filterEstablecimientosRegistrados.getDatosTercero().setEmail(null);
			}

			listaEstablecimientos = this.establecimientosRegistradosService
					.findAllLike(filterEstablecimientosRegistrados, tableRequestDto, false);
			this.establecimientosRegistradosService.getExcel(listaEstablecimientos, response);

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

	}

}
