package com.ejie.ab79.control;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
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.SessionAttributes;

import com.ejie.ab79.clientesWS.ab61WebService.Ab61Exception;
import com.ejie.ab79.clientesWS.ab61WebService.DatosInicioOficio;
import com.ejie.ab79.clientesWS.ab61WebService.DatosLlamadaGenerarExpedienteInicioOficio;
import com.ejie.ab79.clientesWS.ab61WebService.DatosRespuestaConsultaDatosInteresado;
import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.model.RelEstIns;
import com.ejie.ab79.model.expedientes.DatosTerceros;
import com.ejie.ab79.model.expedientes.RelExpTer;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.procedimientos.Procedimientos;
import com.ejie.ab79.model.procedimientos.RelIniOfiOri;
import com.ejie.ab79.service.RelEstInsService;
import com.ejie.ab79.service.expedientes.ExpedientesService;
import com.ejie.ab79.service.expedientes.RelExpTerService;
import com.ejie.ab79.service.inspecciones.InspeccionesService;
import com.ejie.ab79.service.procedimientos.RelIniOfiOriService;
import com.ejie.ab79.webservice.adaptadores.ab61WebServiceAdaptador;

/**
 * ActuacionesController  
 * 
 *  
 */
@SessionAttributes("usuario")
@Controller
@RequestMapping(value = "/inicioOficio")

public class InicioOficioController {

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

	@Autowired
	private RelExpTerService relExpTerService;

	@Autowired
	private RelIniOfiOriService relIniOfiOriService;

	@Autowired
	private ab61WebServiceAdaptador ab61WebServiceAdaptadorService;

	@Autowired
	private ExpedientesService expedienteService;

	@Autowired
	private InspeccionesService inspeccionesService;
	
	@Autowired
	private RelEstInsService relEstInsService;
	
	@Resource
	private ReloadableResourceBundleMessageSource appMessageSource;
	
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String maint() {
		return "inicioOficio";
	}

	@RequestMapping(value = "/{idProcedimiento}", method = RequestMethod.GET)
	public @ResponseBody List<RelIniOfiOri> findInicioOficio(@PathVariable("idProcedimiento") Integer idProcedimiento) {

		Procedimientos procedimiento = new Procedimientos(idProcedimiento);
		List<RelIniOfiOri> relIniOfiOri = this.relIniOfiOriService.findProcInicioOficioByProcOrigen(procedimiento);

		return relIniOfiOri;
	}

	@RequestMapping(value = "/titularParticipantes/{idExpediente}", method = RequestMethod.GET)
	public @ResponseBody List<DatosTerceros> findTitularesParticipacion(
			@PathVariable("idExpediente") Integer idExpediente) {

		List<RelExpTer> listaParticipaciones = this.relExpTerService.findParticipaciones(idExpediente, null);
		List<DatosTerceros> listaTercerosTitulares = new ArrayList<DatosTerceros>();

		for (RelExpTer participacion : listaParticipaciones) {
			for (DatosTerceros participante : participacion.getListaDatosTerceros()) {
				if (Constantes.PARTICIPANTE_TITULAR == participante.getTipoParticipante()) {
					listaTercerosTitulares.add(participante);
				}
			}
		}

		return listaTercerosTitulares;
	}

	@RequestMapping(value = "/abrirModalCreacionExpedienteInicioOficioInspeccion/{idInspeccion}/{idExpediente}", method = RequestMethod.GET)
	public String abrirModalCreacionExpedienteInicioOficioInspeccion(Model model, @PathVariable Integer idInspeccion, @PathVariable Integer idExpediente) {
		logger.info("GET :: abrirModalCreacionExpedienteInicioOficioInspeccion :: Inicio");
		logger.info("GET :: abrirModalCreacionExpedienteInicioOficioInspeccion :: Datos recibidos: Inspeccion: "+idInspeccion);
		
		logger.info("GET :: abrirModalCreacionExpedienteInicioOficioInspeccion :: Se obtienen las participaciones");
		
		if(idInspeccion == null || (idInspeccion != null && idInspeccion.equals(-1))){
			idInspeccion = null;
		}
		if(idExpediente == null || (idExpediente != null && idExpediente.equals(-1))){
			idExpediente = null;
		}
		
		List<RelExpTer> listaParticipantesParticipacion = relExpTerService
				.findParticipaciones(idExpediente, idInspeccion);
		
		List<Integer> listaIdTercerosTitular = new ArrayList<Integer>();
		StringBuilder listaTipoParticipacion = new StringBuilder();
		for (RelExpTer participacion : listaParticipantesParticipacion) {
			for (DatosTerceros participante : participacion.getListaDatosTerceros()) {

				if (participante.getTipoParticipante() == Constantes.PARTICIPANTE_TITULAR) {
					listaIdTercerosTitular.add(participante.getIdTercero());
					if (listaTipoParticipacion.length() == 0) {
						listaTipoParticipacion.append((participacion.getTipoParticipacionDecorator() != null
								? participacion.getTipoParticipacionDecorator() : "*"));
					} else {
						listaTipoParticipacion.append("," + (participacion.getTipoParticipacionDecorator() != null
								? participacion.getTipoParticipacionDecorator() : "*"));
					}
				}
			}
		}
		model.addAttribute("listaIdTercerosTitular", listaIdTercerosTitular);
		model.addAttribute("listaTipoParticipacion", listaTipoParticipacion);
		
		logger.info("GET :: abrirModalCreacionExpedienteInicioOficioInspeccion :: Fin");
		return "crearExpedienteInicioOficioInspeccion";
	}

	@RequestMapping(value = "/consultaDatosInteresado/{idProcedimiento}", method = RequestMethod.POST)
	public @ResponseBody List<DatosRespuestaConsultaDatosInteresado> consultaDatosInteresado(
			@PathVariable Integer idProcedimiento, @RequestBody List<Integer> listaTercerosId) throws Ab61Exception {

		logger.info("POST :: consultaDatosInteresado :: INICIO");
		
		List<DatosRespuestaConsultaDatosInteresado> listaTercerosExpedienteInicioOficio = expedienteService
				.consultaDatosInteresado(idProcedimiento, listaTercerosId);
		
		logger.info("POST :: consultaDatosInteresado :: FIN");
		return listaTercerosExpedienteInicioOficio;
	}
	
	@RequestMapping(value = "/generarExpedienteInicioOficioDatosInteresado/{idProcedimiento}/{idInspeccion}", method = RequestMethod.POST)
	public @ResponseBody String generarExpedienteInicioOficioDatosInteresado(
			@PathVariable Integer idProcedimiento, @PathVariable Integer idInspeccion, @RequestBody DatosLlamadaGenerarExpedienteInicioOficio datosLlamada,
			@ModelAttribute("usuario") Usuario usuario) throws Ab61Exception {

		logger.info("POST :: generarExpedienteInicioOficioDatosInteresado :: INICIO");

		String respuesta = "ok";
		DatosInicioOficio datosInicioOficio = new DatosInicioOficio();
		try {

			logger.info(
					"[generarExpedienteInicioOficioDatosInteresado] :: Llamada a generar el expediente sancionador de inicio oficio");

			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(idInspeccion);
			inspeccion = this.inspeccionesService.find(inspeccion);
			RelEstIns relEstIns = this.relEstInsService.findByInspeccion(inspeccion);
			
			if(relEstIns != null){				
				datosLlamada.setTituloExpediente(relEstIns.getTitulo());
			}
			datosLlamada.setExpedienteOrigen(datosLlamada.getExpedienteOrigen());
			datosLlamada.setExpedienteInicioOficioSanciones(false);
			datosInicioOficio = expedienteService.crearExpedienteInicioOficioDatosInteresado(
					idProcedimiento, usuario, datosLlamada);
			
			if(datosInicioOficio != null && datosInicioOficio.getFolderID() != null && !datosInicioOficio.getFolderID().equals("") && relEstIns != null){
				relEstIns.setFolderId(datosInicioOficio.getFolderID());
				relEstIns.setUsuarioUltModificacion(usuario.getUsuario());
				this.relEstInsService.update(relEstIns);
			}else if(datosInicioOficio != null && datosInicioOficio.getFolderID() != null && !datosInicioOficio.getFolderID().equals("") && relEstIns == null){
				respuesta += "_"+datosInicioOficio.getFolderID();
			}
		} catch (Ab61Exception e) {
			String idioma = LocaleContextHolder.getLocale().getLanguage();
			if ("es".equalsIgnoreCase(idioma)) {
				respuesta = e.getFaultInfo().getMensajeCastellano();
			} else {
				respuesta = e.getFaultInfo().getMensajeEuskera();
			}
		} catch (Exception ex) {
			logger.error(ex.getMessage(), ex);
			
			Locale locale = LocaleContextHolder.getLocale();
			respuesta = appMessageSource.getMessage("error.expedienteInicioOficio", null, locale);
		}

		logger.info("POST :: generarExpedienteInicioOficioDatosInteresado :: FIN");
		return respuesta;
	}

}
