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.Expedientes;
import com.ejie.ad74a.service.tramitacion.TramitacionService;
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 solicitud informe intervencion
 * 
 * @author IBERMATICA
 */

@Service(value = "tareaSolicitudInformeIntervencionService")
public class TareaSolicitudInformeIntervencionServiceImpl implements TareaSolicitudInformeIntervencionService {

	private static final Logger logger = LoggerFactory.getLogger(TareaSolicitudInformeIntervencionServiceImpl.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 {
		TareaSolicitudInformeIntervencionServiceImpl.logger.info(
				"TareaSolicitudInformeIntervencionServiceImpl.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());

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

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

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

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

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

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

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

		return task;
	}

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

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

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

		return tTask;
	}

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

		TTask tTask = this.prepararTarea(taskGUID);

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

		tTask = this.ejecutarTarea(tTask);

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

		return tTask;
	}
}
