package es.pulsoft.dao;

import java.util.List;

import javax.transaction.Transactional;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import es.pulsoft.controlador.entity.CursoEstudiante;

/**
 * Clase que implementa la interfaz CursoEstudianteDao para realizar operaciones CRUD
 * relacionadas con la inscripción de estudiantes en cursos.
 * 
 * @author [Tu Nombre]
 */
@Repository
public class CursoEstudianteDaoClase implements CursoEstudianteDao {

    @Autowired
    private SessionFactory sessionFactory;

    /**
     * Inscribe o actualiza la inscripción de un estudiante en un curso.
     * 
     * @param cursoEstudiante el objeto CursoEstudiante con los detalles de la inscripción
     */
    @Override
    @Transactional
    public void inscipcion(CursoEstudiante cursoEstudiante) {
        // Obtención de la sesión actual de Hibernate
        Session session = sessionFactory.getCurrentSession();

        try {
            // Guarda o actualiza el objeto cursoEstudiante en la base de datos
            session.saveOrUpdate(cursoEstudiante);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Obtiene todas las inscripciones de estudiantes en cursos.
     * 
     * @return una lista de objetos CursoEstudiante que representan todas las inscripciones
     */
    @Override
    @Transactional
    public List<CursoEstudiante> obtenerInscripciones() {
        List<CursoEstudiante> listaInscripciones = null;
        Session session = sessionFactory.getCurrentSession();

        try {
            // Ejecuta una consulta HQL para obtener todas las inscripciones
            listaInscripciones = session.createQuery("from CursoEstudiante", CursoEstudiante.class).getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return listaInscripciones;
    }

    /**
     * Elimina la inscripción de un estudiante en un curso.
     * 
     * @param cursoEstudiante el objeto CursoEstudiante que representa la inscripción a eliminar
     */
    @Override
    @Transactional
    public void borrar(CursoEstudiante cursoEstudiante) {
        Session session = sessionFactory.getCurrentSession();

        try {
            // Elimina el objeto cursoEstudiante de la base de datos
            session.delete(cursoEstudiante);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Obtiene la inscripción de un estudiante en un curso por su ID.
     * 
     * @param id el ID de la inscripción a buscar
     * @return el objeto CursoEstudiante correspondiente al ID proporcionado, o null si no se encuentra
     */
    @Override
    @Transactional
    public CursoEstudiante obtenerCursoEstudiante(int id) {
        Session session = sessionFactory.getCurrentSession();
        CursoEstudiante cursoEstudiante = null;
        
        try {
            // Obtiene el objeto CursoEstudiante por su ID
            cursoEstudiante = session.get(CursoEstudiante.class, id);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return cursoEstudiante;
    }

    /**
     * Busca inscripciones de estudiantes basándose en un valor y un campo específico.
     * 
     * @param valor el valor a buscar en el campo
     * @param campo el campo en el que realizar la búsqueda ("estudiante" o "curso")
     * @return una lista de objetos CursoEstudiante que cumplen con los criterios de búsqueda
     */
    @Override
    @Transactional
    public List<CursoEstudiante> buscar(String valor, String campo) {
        Session session = sessionFactory.getCurrentSession();
        List<CursoEstudiante> listaInscripciones = null;

        try {
            String hql = "from CursoEstudiante ce";

            // Añade condiciones a la consulta dependiendo del campo especificado
            if ("estudiante".equals(campo)) {
                hql += " where ce.estudiante.nombre like :valor";
            } else if ("curso".equals(campo)) {
                hql += " where ce.curso.nombre like :valor";
            }

            // Ejecuta la consulta con el valor y el campo proporcionado
            listaInscripciones = session.createQuery(hql, CursoEstudiante.class)
                                        .setParameter("valor", valor + "%")
                                        .getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return listaInscripciones;
    }
}
