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.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.util.constantes.modelos.TipoExpedientes;
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 Cierre del Expediente
 * 
 * @author IBERMATICA
 */
@Service(value = "tareaCierreService")
public class TareaCierreServiceImpl implements TareaCierreService {

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

	@Autowired
	private PlateaService plateaService;

	@Autowired
	private ExpedientesDao expedientesDao;

	@Autowired
	private TramitacionService tramitacionService;

	public void eventoTarea(Task task, String status) {

	}

	/**
	 * Método que gestiona el evento de Tarea Sugerida
	 * 
	 */
	public void tareaSugerida(Task task) throws Throwable {
		TareaCierreServiceImpl.logger.info("TareaCierreServiceImpl.tareaSugerida - 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 cierre: no se ha encontrado el expediente FolderId: "
							+ task.getFolderID());
		}

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

		// actualizamos el estado del expediente a Pendiente de cierre
		expediente.getEstados().setIdEstado30(EstadosExpedienteEnum.PEND_CERRAR.getId());
		this.expedientesDao.updateEstado(expediente);

		this.ejecutarTareaAutomatica(task.getMailboxTaskID());

		TareaCierreServiceImpl.logger.info("TareaCierreServiceImpl.tareaSugerida - Fin ");
	}

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

		// almacenamos el tramite y la tarea
		this.tramitacionService.tratamientoTramiteTareaEjecutada(task, true);

		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 ejecutar la tarea de cierre: no se ha encontrado el expediente FolderId: "
							+ task.getFolderID());
		}
		// el estado del expediente se actualiza a ‘Cerrado’
		expediente.getEstados().setIdEstado30(EstadosExpedienteEnum.CERRADO.getId());
		this.expedientesDao.updateEstado(expediente);

		// se graba la fecha de cierre
		// actualizamos el estado del expediente a Pendiente de cierre
		expediente.setfCierre00(UtilidadesFecha.getFechaSistema());
		this.expedientesDao.updateFCierre(expediente);

		// pendiente de envio a archivo.
		expediente.setArchivo00(TipoExpedientes.Archivo00.PENDIENTE_ENVIO.getValue());
		this.expedientesDao.updatePendienteEnvioArchivo(expediente);

		TareaCierreServiceImpl.logger.info("TareaCierreServiceImpl.tareaEjecutada - fin ");

	}

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

		// preparamos tarea de Platea
		TTask tTask = plateaService.prepareTask(taskGUID, TTaskType.CERREXP);

		TareaCierreServiceImpl.logger
				.info("TareaCierreServiceImpl.prepararTarea -" + tTask.getTaskID() + "-" + taskGUID + "- fin ");
		return tTask;
	}

	/**
	 * Ejecución de la tarea
	 */
	public TTask ejecutarTarea(TTask task) throws Throwable {

		TareaCierreServiceImpl.logger
				.info("TareaCierreServiceImpl.prepararTarea -" + task.getMailboxTaskID() + "- inicio ");

		// preparamos tarea de Platea
		TTask tTask = plateaService.doTask(TareasEnum.getTaskType(task.getTaskID()), task);

		TareaCierreServiceImpl.logger
				.info("TareaCierreServiceImpl.prepararTarea -" + task.getMailboxTaskID() + "- fin ");
		return tTask;
	}

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

		TTask task = this.prepararTarea(taskGUID);

		task.getTaskClose().setCloseDate(UtilidadesFecha.getFechaSistema(Constantes.DATE_FORMAT_PLATEA_XML_EVENTS));

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

		TareaCierreServiceImpl.logger.info("TareaCierreServiceImpl.ejecutarTareaAutomatica -" + taskGUID + "- fin ");
		return this.ejecutarTarea(task);

	}
}
