package com.fp.viaticos.mail.thread;

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

import com.fp.bpmlib.flow.RuleUtil;
import com.fp.common.logger.APPLogger;
import com.fp.dto.Request;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.commondb.PersistenceManager;
import com.fp.persistence.commondb.data.SessionData;
import com.fp.persistence.commondb.data.ThreadFacade;
import com.fp.viaticos.mail.Empleado;
import com.fp.viaticos.mail.Tesoreria;

/**
 * Hilo que se encarga de enviar mail's al empleado y/o tesoreria por solicitud. El mail se envia si el usuario tiene
 * tareas en estatus aprobar o por ingresar informe.
 * 
 * @author Jorge Vaca.
 * @version 2.1
 */
public class MailPorSolicitud implements Runnable {

    /**
     * Request con el que inicia la transaccion de envio de correos.
     */
    private final SaveRequest saverequest;

    /**
     * Numero de solicitud a obtener informacion asociada a la solicitud con la que se envia el mail.
     */
    private final String csolicitud;

    /**
     * S solicitud. I informe.
     */
    private final String tipo;

    /**
     * Numero de dias desde la fecha de vencimiento del viatico.
     */
    private final Integer dias;

    /**
     * Crea una instancia de MailPorSolicitud.
     * 
     * @param saverequest Objeto con el que inicia una solicitud.
     * @param csolicitud Numero de solicitus.
     * @param tipo Tipo de registro, S solicitud, I informe.
     * @throws Exception
     */
    public MailPorSolicitud(SaveRequest saverequest, String csolicitud, String tipo, Integer dias) throws Exception {
        this.saverequest = saverequest;
        this.csolicitud = csolicitud;
        this.tipo = tipo;
        this.dias = dias;
    }

    /**
     * Metodo que se encarga de inicio de ejecucion del hilo.
     */
    @Override
    public void run() {
        try {
            process();
        } catch (Exception e) {
            APPLogger.getLogger().error(e);
        }
    }

    /**
     * Metodo que se encarga de la llamada al ejb para la ejecucion de una cuenta.
     * 
     * @throws Exception Se presenta en el caso que la el proceso de la tarea no haya sido satisfactoria
     */
    private void process() throws Exception {
        try {
            SessionData s = new SessionData();
            s.setCompany(saverequest.getCompany());
            ThreadFacade.setSaveRequest(s);
            PersistenceHelper.setEntityManager(PersistenceManager.getInstance().createEntityManagerLocal());
            PersistenceHelper.beginNewTransaction();
            this.sendMail();
            PersistenceHelper.commitNewTransaction();
        } catch (Exception e) {
            PersistenceHelper.rollbackNewTransaction();
            APPLogger.getLogger().error(e);
        }
    }

    /**
     * Envia mail al empleado y a tesoria si tiene 4 dias de reteazo en tomar acciones en el flujo.
     * 
     * @throws Exception
     */
    private void sendMail() throws Exception {
        RuleUtil.setSubjectTemplate(1);
        RuleUtil.setContentTemplate(2);
        List<String> lemail = new ArrayList<String>();

        Empleado emp = new Empleado();
        lemail.addAll(emp.getEmail(csolicitud, tipo));

        if (dias == 4) {
            Tesoreria t = new Tesoreria();
            lemail.addAll(t.getEmail(csolicitud, tipo));
        }

        for (String email : lemail) {
            RuleUtil.toAddress(email);
        }
        if (!lemail.isEmpty()) {
            Request request = new Request();
            saverequest.copy(request);
            request.put("csolicitud", csolicitud);
            RuleUtil.sendMail(request);
        }
    }

}
