package com.ejie.ab63.control.inicio;

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.context.i18n.LocaleContextHolder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.support.RequestContextUtils;

import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.control.expedientes.ExpedienteBaseContoller;
import com.ejie.ab63.model.DispensaEstablecimiento;
import com.ejie.ab63.model.Inspeccion;
import com.ejie.ab63.model.expedientes.Expedientes;
import com.ejie.ab63.model.inicio.InitForm;
import com.ejie.ab63.model.usuario.Usuario;
import com.ejie.ab63.service.DispensaEstablecimientoService;

/**
 * Acceso a la aplicacion
 * 
 *  
 */
@Controller()
@SessionAttributes("usuario")
@RequestMapping(value = "/inicio")
public class InitController extends ExpedienteBaseContoller {

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

	@Autowired
	private DispensaEstablecimientoService dispensaService;

	@Override
	protected String getCurrentPage() {
		return Constantes.PESTANA_EXPEDIENTE;
	}

	@Override
	protected String getTilesPage() {
		return "datosExpediente";
	}

	@Override
	protected void setCurrentPageModel(Model model, InitForm initForm) {
		if (initForm.isExpedienteOficio() && initForm.isIdentificadorEmpty()) {
			model.addAttribute("showSearchIdentificador", true);
		}
		Inspeccion inspeccion = this.getExpedientesService().getInspectExpedient(initForm.getIdExpediente());
		logger.info("id Inspeccion " + inspeccion + " para el expediente " + initForm.getIdExpediente());
		if (inspeccion != null && inspeccion.getIdInspeccion() != null && inspeccion.getIdInspeccion() > 0) {
			initForm.setIdInspeccionExpediente(new Long(inspeccion.getIdInspeccion()));
		}
		initForm.setEnableUpdateDirecciones(true);
		setListParticipantes(model, initForm);
		Boolean isEnableChangeNreg = false;
		try {
			isEnableChangeNreg = this.getEstablecimientoService().canChangeIdentifiadorExp(initForm.getIdExpediente(),
					initForm.getIdTerceroTitular());
		} catch (Exception e) {
			isEnableChangeNreg = false;
		}
		DispensaEstablecimiento dispensa = new DispensaEstablecimiento();
		dispensa.setFolderId(initForm.getFolderId());
		if (dispensaService.existsDispensaForExp(initForm.getFolderId())) {
			dispensa = dispensaService.findByExpediente(dispensa);
		}

		String descs = "{0}###{1}"
				.replace("{0}", dispensa.getObservacionesDescEs() == null ? "" : dispensa.getObservacionesDescEs())
				.replace("{1}", dispensa.getObservacionesDescEu() == null ? "" : dispensa.getObservacionesDescEu());
		initForm.setObservaciones(descs);
		initForm.setDispensado(dispensa.getDispensado());

		model.addAttribute("isEnableChangeNreg", isEnableChangeNreg);
	}

	/**
	 * Method 'initApp' metodo de entrada a la aplicacion
	 * 
	 * @param httpRequest
	 *            HttpServletRequest
	 * @param procedureId
	 *            String
	 * @param folderId
	 *            String
	 * @param folderNumber
	 *            String
	 * @param fechaSolicitud
	 *            String
	 * @param folderDescription
	 *            String
	 * @param dni
	 *            String
	 * @param tipoExpediente
	 *            String
	 * @param tramite
	 *            String
	 * @param tarea
	 *            String
	 * @param idioma
	 *            String
	 * @param model
	 *            Model
	 * 
	 * @return ModelAndView
	 * @throws Exception
	 */
	@RequestMapping(method = RequestMethod.POST)
	public ModelAndView postAccess(HttpServletRequest httpRequest, HttpServletResponse response,
			@RequestParam(value = "procedureId") String procedureId, @RequestParam(value = "folderId") String folderId,
			@RequestParam(value = "folderNumber") String folderNumber,
			@RequestParam(value = "fechaSolicitud") String fechaSolicitud,
			@RequestParam(value = "folderDescription") String folderDescription,
			@RequestParam(value = "dni") String dni, @RequestParam(value = "expConv") String tipoExpediente,
			@RequestParam(value = "tramite") String tramite, @RequestParam(value = "tarea") String tarea,
			@RequestParam(value = "idioma") String idioma, Model model) throws Exception {

		// Se cambia el idioma para que se entre en la aplicacion con el que
		// llega como parametro
		Locale locale = new Locale(idioma);
		LocaleContextHolder.setLocale(locale);
		// Sobreescribir cookie
		((CookieLocaleResolver) RequestContextUtils.getLocaleResolver(httpRequest)).setLocale(httpRequest, response,
				locale);

		Authentication aut = SecurityContextHolder.getContext().getAuthentication();
		InitController.logger.info("autotenticación:getAuthentication" + aut);

		/** Dejamos el usuario logueado en session */
		Usuario usuario = new Usuario();
		String username = "";
		if (null != aut) {
			username = (String) aut.getPrincipal();
		}
		usuario.setNombreUsuario(username);
		model.addAttribute("usuario", usuario);

		InitForm init = this.guardarDatosTramitagune(procedureId, folderId, folderNumber, fechaSolicitud,
				folderDescription, dni, tipoExpediente, tramite, tarea, idioma);
		return this.getAccess(httpRequest, model, init, usuario);

	}

	private InitForm guardarDatosTramitagune(String procedureId, String folderId, String folderNumber,
			String fechaSolicitud, String folderDescription, String dni, String tipoExpediente, String tramite,
			String tarea, String idioma) {
		InitController.logger.info("[procedureId = " + procedureId + ", folderId = " + folderId + ", folderNumber = "
				+ folderNumber + ", fechaSolicitud = " + fechaSolicitud + ", folderDescription = " + folderDescription
				+ ", dni = " + dni + ", tramite = " + tramite + ", tarea = " + tarea + ", tipoExpediente = "
				+ tipoExpediente + ", idioma = " + idioma);

		InitForm initForm = new InitForm();
		initForm.setProcedureId(procedureId);
		initForm.setFolderId(folderId);
		initForm.setFolderNumber(folderNumber);
		initForm.setFechaSolicitud(fechaSolicitud);
		initForm.setFolderDescription(folderDescription);
		initForm.setDni(dni);
		initForm.setTramite(tramite);
		initForm.setTarea(tarea);
		initForm.setTipoExpediente(tipoExpediente);
		initForm.setIdioma(idioma);

		return initForm;
	}

	@RequestMapping(method = RequestMethod.GET)
	private ModelAndView getAccess(HttpServletRequest httpRequest, Model model, InitForm initForm, Usuario usuario)
			throws Exception {
		InitController.logger.info("[INICIO] Acceso a la aplicacion por Init");
		model.addAttribute("initForm", initForm);
		Expedientes expedientes = new Expedientes();
		expedientes.setFolderId(initForm.getFolderId());
		expedientes = this.getExpedientesService().findByFolderId(expedientes);
		if (expedientes != null) {
			initForm.setIdExpediente(expedientes.getIdExpediente());
			if (expedientes.getIdExpedienteOrigen() != null && expedientes.getIdExpedienteOrigen() > 0) {
				initForm.setIdExpedienteOrigen(expedientes.getIdExpedienteOrigen());
			}
			initForm.setTituloExpediente(expedientes.getTitulo());
			expedientes.setFolderNumber(initForm.getFolderNumber());
			expedientes.setFolderId(initForm.getFolderId());
			// Expedientes expedienteFilter =
			// this.getExpedientesService().updateFolder(expedientes);
			// expedienteFilter.setIdExpediente(initForm.getIdExpediente());
			return mostrar(model, initForm, usuario);
		}
		return new ModelAndView("folderNoExiste");
	}

	/**
	 * 
	 * @param httpRequest
	 *            HttpServletRequest
	 * @param model
	 *            Model
	 * @param datosTramitagune
	 *            InitForm
	 * 
	 * @return ModelAndView
	 * @throws Exception
	 */
	@RequestMapping(value = "/initCambioIdioma", method = RequestMethod.POST)
	public ModelAndView initCambioIdioma(HttpServletRequest httpRequest, Model model, InitForm datosTramitagune,
			Usuario usuario) throws Exception {
		InitController.logger.info("[INICIO initCambioIdioma] Cambio de idioma.");
		return this.getAccess(httpRequest, model, datosTramitagune, usuario);
	}

}
