package com.ejie.ad74a.tareas.service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ejie.ad74a.dao.ExpedientesDao;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.jms.util.ModelApplicationParser;
import com.ejie.ad74a.model.Estados;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.service.tramitacion.TramitacionService;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.EstadosExpedienteEnum;
import com.ejie.ad74a.util.constantes.TareasEnum;
import com.ejie.ad74a.ws.client.platea.model.task.Task;
import com.ejie.ad74a.ws.client.platea.service.PlateaService;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTask;
import com.ejie.ad74a.ws.client.platea.tareasTramitacion.TTaskType;

/**
 * Gestión de la Tarea de Paso a Desistimiento Tácito
 * 
 * @author IBERMATICA
 */

@Service(value = "tareaPasoDesistimientoService")
public class TareaPasoDesistimientoServiceImpl implements TareaPasoDesistimientoService {

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

	@Autowired
	private TramitacionService tramitacionService;

	@Autowired
	private PlateaService plateaService;

	@Autowired
	private ExpedientesDao expedientesDao;

	/**
	 * Método que gestiona el evento de Tarea Sugerida
	 * 
	 */
	public void tareaSugerida(Task task) throws Throwable {
		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.tareaSugerida -" + task.getMailboxTaskID() + "- inicio ");

		String numRegistro = ModelApplicationParser.getNumRegistryFromTask(task);

		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(task.getFolderID());
		List<Expedientes> listaExpedientes = expedientesDao.findAll(expediente, null);

		if (null != listaExpedientes && listaExpedientes.size() > 0) {
			expediente = listaExpedientes.get(0);
		} else {
			ManagerErrors.manageError(
					"Error al sugerir la tarea de paso a desistimiento: no se ha encontrado el expediente FolderId: "
							+ task.getFolderID());
		}

		// almacenamos el tramite y la tarea
		this.tramitacionService.tratamientoTramiteTareaSugerida(task, numRegistro, expediente);

		// ** Ejecutar de forma Automática **/
		this.ejecutarTareaAutomatica(task.getMailboxTaskID());

		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.tareaSugerida -" + task.getMailboxTaskID() + "- fin ");
	}

	/**
	 * Método que gestiona el evento de Tarea Ejecutada
	 */
	public void tareaEjecutada(Task task) throws Throwable {
		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.tareaEjecutada -" + task.getMailboxTaskID() + "- inicio ");

		// ** Actualizar trámite y tarea **/
		this.tramitacionService.tratamientoTramiteTareaEjecutada(task, false);

		// actualizamos el estado del expediente y el tipo de desistimiento
		Expedientes expediente = new Expedientes();
		expediente.setFolderId00(task.getFolderID());
		List<Expedientes> listaExpedientes = expedientesDao.findAll(expediente, null);

		if (null != listaExpedientes && listaExpedientes.size() > 0) {
			expediente = listaExpedientes.get(0);
		} else {
			ManagerErrors.manageError(
					"Error al sugerir la tarea de paso a desistimiento: no se ha encontrado el expediente FolderId: "
							+ task.getFolderID());
		}

		expediente.setEstados(new Estados(EstadosExpedienteEnum.PEND_RESOL_DES.getId()));
		this.expedientesDao.updateEstado(expediente);
		expediente.setTipoDesis00(Constantes.TiposDesistimiento.TIPO_DESISTIMIENTO_TACITO);
		expediente.setfDesistimiento00(UtilidadesFecha.parsearFechaPlatea(task.getDoTimestamp()));
		// actualizamos el estado a lo que corresponda
		expediente = this.expedientesDao.updateDesistimiento(expediente);

		// ** Apertura resolucion desistimiento ** //
		this.tramitacionService.sugerirTarea(task, TareasEnum.RESOL_DESISTIMIENTO);

		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.tareaEjecutada -" + task.getMailboxTaskID() + "- fin ");
	}

	/**
	 * Preparación de la tarea
	 */
	public TTask prepararTarea(String taskGUID) throws Throwable {
		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.prepararTarea -" + taskGUID + "- inicio ");

		TTask task = plateaService.prepareTask(taskGUID, TTaskType.GENERICA);

		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.prepararTarea -" + task.getTaskGUID() + "- fin ");

		return task;
	}

	/**
	 * Ejecución de la tarea
	 */
	public TTask ejecutarTarea(TTask tTask) throws Throwable {
		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.prepararTarea -" + tTask.getTaskGUID() + "- inicio ");

		tTask = plateaService.doTask(TareasEnum.getTaskType(tTask.getTaskID()), tTask);

		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.prepararTarea -" + tTask.getTaskGUID() + "- fin ");

		return tTask;
	}

	/**
	 * Ejecución de la tarea de forma automática
	 */
	@Override
	public TTask ejecutarTareaAutomatica(String taskGUID) throws Throwable {
		TareaPasoDesistimientoServiceImpl.logger
				.info("TareaPasoDesistimientoServiceImpl.ejecutarTareaAutomatica -" + taskGUID + "- inicio ");

		TTask tTask = this.prepararTarea(taskGUID);

		// Automática
		tTask.setSenderID(TareasUtils.getSenderIdAutomatico());

		tTask = this.ejecutarTarea(tTask);

		TareaPasoDesistimientoServiceImpl.logger.info("TareaPasoDesistimientoServiceImpl.ejecutarTareaAutomatica -"
				+ tTask.getMailboxTaskID() + "-" + taskGUID + "- fin ");

		return tTask;
	}
}
