package com.fp.persistence.commondb;

import com.fp.common.exception.ExceptionHandler;
import com.fp.common.logger.APPLogger;
import com.fp.dto.hb.HibernateBean;
import com.fp.persistence.commondb.data.SessionData;
import com.fp.persistence.commondb.data.ThreadFacade;

/**
 * Clase que permite grabar o actualizar información en la base de datos en una sesión de base de datos independiente a
 * la utiliza en la ejecución de una transacción..
 * 
 * @version 2.1
 */
public class NestedSave extends Thread {
    private final HibernateBean[] bean;

    private final Integer company;

    private boolean merge;

    public NestedSave(Integer pCompany, HibernateBean... pBean) {
        bean = pBean;
        company = pCompany;
    }

    public NestedSave(Integer pCompany, boolean merge, HibernateBean... pBean) {
        bean = pBean;
        company = pCompany;
        this.merge = merge;
    }

    @Override
    public void run() {
        try {
            SessionData s = new SessionData();
            s.setCompany(company);
            ThreadFacade.setSaveRequest(s);
            PersistenceHelper.setEntityManager(PersistenceManager.getInstance().createEntityManagerLocal());
            PersistenceHelper.beginNewTransaction();
            for (HibernateBean b : bean) {
                if (!merge) {
                    APPLogger.getLogger().info("Inserta registro de auditoria");
                    PersistenceHelper.getEntityManager().detach(b);
                    PersistenceHelper.save(b);
                } else {
                    PersistenceHelper.getEntityManager().merge(b);
                }

            }
            PersistenceHelper.commitNewTransaction();
        } catch (Exception e) {
            PersistenceHelper.rollbackNewTransaction();
            ExceptionHandler eh = new ExceptionHandler(e, "es");
            String usrmsg = eh.getUserMessage();
            APPLogger.getLogger().error("User Message:==> " + usrmsg);
            APPLogger.getLogger().error("Stack trace:==> " + eh.getStackTrace());
        } finally {
            PersistenceHelper.closeSession();
        }
    }
}
