/*
 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
 */
package com.arrebol.taxiservicios.controller.admin.message;

import com.arrebol.taxiservicios.controller.admin.GenericPersonController;
import com.arrebol.taxiservicios.controller.predio.PredioController;
import com.arrebol.taxiservicios.controller.util.HibernateUtil;
import com.arrebol.taxiservicios.model.catalog.Location;
import com.arrebol.taxiservicios.model.catalog.MensajePredefinido;
import com.arrebol.taxiservicios.model.core.User;
import com.arrebol.taxiservicios.model.enums.GenericEnumType;
import com.arrebol.taxiservicios.model.predio.MensajeEnviado;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author pc one
 */
public class MessageController extends GenericPersonController implements Serializable {

    private static final long serialVersionUID = -6265444716269535946L;
    final Logger logger = LogManager.getLogger(PredioController.class);

   public List<MensajePredefinido> fillAllMensajePredefinido(Location location) {
    List<MensajePredefinido> resultList = null;
    Transaction transaction = null;
    try {
        logger.info("Searching for mensajes predefinidos..");
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        transaction = session.beginTransaction();
        CriteriaBuilder builder = session.getCriteriaBuilder();

        CriteriaQuery<MensajePredefinido> criteria = builder.createQuery(MensajePredefinido.class);
        Root<MensajePredefinido> root = criteria.from(MensajePredefinido.class);

        Predicate criterio = builder.and(
            builder.equal(root.get("active"), 1),
            builder.equal(root.get("createdBy").get("location"), location)  // Agregar filtro por ubicación
        );
        
        criteria.where(criterio);
        criteria.orderBy(builder.asc(root.get("createdOn")));
        resultList = session.createQuery(criteria).getResultList();

        logger.info("Total of mensajes predefinidos found: " + (null == resultList ? -1 : resultList.size()));
        transaction.commit();
    } catch (HibernateException e) {
        logger.error("Mensajes predefinidos cannot be loaded " + e);
        rollback(transaction);
    } catch (Exception e) {
        logger.error("Method fillAllMensajePredefinido() " + e);
        rollback(transaction);
    }
    return resultList;
}


    public MensajePredefinido fillByIdMensajePredefinido(String id) {
        MensajePredefinido result = null;
        Transaction transaction = null;
        try {
            logger.info("Searching for mensajes predefinidos..");
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            transaction = session.beginTransaction();
            CriteriaBuilder builder = session.getCriteriaBuilder();

            CriteriaQuery<MensajePredefinido> criteria = builder.createQuery(MensajePredefinido.class);
            Root<MensajePredefinido> root = criteria.from(MensajePredefinido.class);

            Predicate criterio = (builder.equal(root.get("id"), id));
            criteria.where(builder.and(criterio));
            result = session.createQuery(criteria).getSingleResult();

            logger.info("Mensaje predefinido found: " + result);
            transaction.commit();
        } catch (HibernateException e) {
            logger.error("Mensaje predefinido cannot be loaded " + e);
            rollback(transaction);
        } catch (Exception e) {
            logger.error("Method fillByIdMensajePredefinido() " + e);
            rollback(transaction);
        }
        return result;
    }

    public boolean addMensajePredefinido(MensajePredefinido mensaje, User user, boolean save) {
        logger.info("addMensajePredefinido");
        boolean success = false;
        Transaction transaction = null;

        try {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            transaction = session.beginTransaction();

            if (save) {
                mensaje.setCreatedBy(user);
                mensaje.setCreatedOn(new Date());
                session.save(mensaje);
                transaction.commit();
                logger.info("Mensaje predefinido saved " + mensaje.getId());
            } else {
                mensaje.setLastUpdatedBy(user);
                mensaje.setLastUpdatedOn(new Date());
                session.update(mensaje);
                transaction.commit();
                logger.info("Mensaje predefinido updated " + mensaje.getId());
            }

            success = true;
        } catch (HibernateException e) {
            logger.error("Mensaje predefinido can not be added ", e);
            rollback(transaction);
        } catch (Exception e) {
            logger.error("Method addMensajePredefinido() ", e);
            rollback(transaction);
        }
        return success;
    }

    public Boolean addMensajeEnviado(MensajeEnviado mensaje, User user, boolean save) {
        logger.info("addMensajeEnviado");
        boolean success = false;
        Transaction transaction = null;

        try {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            transaction = session.beginTransaction();

            if (save) {
                mensaje.setCreatedBy(user);
                mensaje.setCreatedOn(new Date());
                session.save(mensaje);
                transaction.commit();
                logger.info("Mensaje enviado saved " + mensaje.getId());
            } else {
                mensaje.setLastUpdatedBy(user);
                mensaje.setLastUpdatedOn(new Date());
                session.update(mensaje);
                transaction.commit();
                logger.info("Mensaje enviado updated " + mensaje.getId());
            }

            success = true;
        } catch (HibernateException e) {
            logger.error("Mensaje enviado can not be added ", e);
            rollback(transaction);
        } catch (Exception e) {
            logger.error("Method addMensajeEnviado() ", e);
            rollback(transaction);
        }
        return success;
    }

}
