package com.ejie.ad74a.tareas.service;

import java.util.List;

import org.apache.commons.lang.exception.ExceptionUtils;
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.ConstantesCodeError;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.jms.util.ModelApplicationParser;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.service.tramitacion.TramitacionService;
import com.ejie.ad74a.util.constantes.Constantes;
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 Tareas de Aperturas de Plazo
 * 
 * @author IBERMATICA
 */

@Service(value = "tareaAbrirPlazoService")
public class TareaAbrirPlazoServiceImpl implements TareaAbrirPlazoService {

	private static final Logger logger = LoggerFactory.getLogger(TareaAbrirPlazoServiceImpl.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 {
		TareaAbrirPlazoServiceImpl.logger.info("TareaAbrirPlazoService.tareaSugerida -" + task.getTaskID() + "-"
				+ 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 apertura de plazo: no se ha encontrado el expediente FolderId: "
							+ task.getFolderID());
		}

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

		// ** Por regla general TODAS las tareas de ABRIR PLAZO se ejecutan de forma
		// automática ** //
		// Ejecutamos de forma Automática
		this.ejecutarTareaAutomatica(task.getMailboxTaskID());

		TareaAbrirPlazoServiceImpl.logger.info("TareaAbrirPlazoService.tareaSugerida -" + task.getTaskID() + "-"
				+ task.getMailboxTaskID() + "-  fin ");
	}

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

		this.tramitacionService.tratamientoTramiteTareaEjecutada(task, false);

		TareaAbrirPlazoServiceImpl.logger.info("TareaAbrirPlazoService.tareaEjecutada -" + task.getTaskID() + "-"
				+ task.getMailboxTaskID() + "-  fin ");
	}

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

		TTask task = null;

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

		TareaAbrirPlazoServiceImpl.logger.info("TareaAbrirPlazoService.prepararTarea -" + task.getTaskID() + "-"
				+ task.getMailboxTaskID() + "-  fin ");

		return task;
	}

	/**
	 * Ejecución de la tarea
	 */
	public TTask ejecutarTarea(TTask task) throws Throwable {
		TareaAbrirPlazoServiceImpl.logger.info("TareaAbrirPlazoService.ejecutarTarea -" + task.getTaskID() + "-"
				+ task.getMailboxTaskID() + "-  inicio ");

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

		TareaAbrirPlazoServiceImpl.logger.info("TareaAbrirPlazoService.ejecutarTarea -" + task.getTaskID() + "-"
				+ task.getMailboxTaskID() + "-  fin ");

		return task;
	}

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

		TTask tTask = null;
		try {
			// Preparamos la tarea
			tTask = this.prepararTarea(taskGUID);

			// Incluimos SenderId=CodApp
			tTask.setSenderID(TareasUtils.getSenderIdAutomatico());

			if (null == tTask.getProcessingRoleID()) {
				tTask.setProcessingRoleID(Constantes.PROCESSING_ROLE_ID);
			}

		} catch (Throwable e) {
			TareaAbrirPlazoServiceImpl.logger
					.error("TareaAbrirPlazoService.ejecutarTareaAutomatica Error: " + ExceptionUtils.getStackTrace(e));
			ManagerErrors.manageException(e,
					ConstantesCodeError.MENSAJE_ERROR_PREPARAR_TAREA + " " + tTask.getTaskID()
							+ TareasEnum.getEnumByTaskId(tTask.getTaskID()).getTaskId(),
					null, ConstantesCodeError.CODE_ERROR_PREPARAR_TAREA + "" + tTask.getTaskID(), null);
		}

		try {
			// Lanzamos la ejecucion de la tarea
			tTask = this.ejecutarTarea(tTask);

		} catch (Throwable e) {
			ManagerErrors.manageException(e,
					ConstantesCodeError.MENSAJE_ERROR_EJECUTAR_TAREA + " " + tTask.getTaskID()
							+ TareasEnum.getEnumByTaskId(tTask.getTaskID()).getTaskId(),
					null, ConstantesCodeError.CODE_ERROR_EJECUTAR_TAREA + " " + tTask.getTaskID(), null);
		}

		TareaAbrirPlazoServiceImpl.logger
				.info("TareaAbrirPlazoService.ejecutarTareaAutomatica -" + taskGUID + "-  fin ");

	}

}
