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.Curso;

/**
 * Implementación del DAO para la entidad Curso.
 * Gestiona operaciones CRUD y de búsqueda usando Hibernate y Spring.
 */
@Repository
public class CursoDaoClase implements CursoDao {

    @Autowired
    private SessionFactory sessionFactory;

    /**
     * Inserta o actualiza un curso en la base de datos.
     *
     * @param curso El objeto Curso que se desea insertar o actualizar.
     */
    @Override
    @Transactional
    public void insertarCurso(Curso curso) {
        Session session = sessionFactory.getCurrentSession();
        try {
            // Guarda o actualiza el curso en la base de datos
            session.saveOrUpdate(curso);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Recupera todos los cursos almacenados en la base de datos.
     *
     * @return Una lista con todos los cursos.
     */
    @Override
    @Transactional
    public List<Curso> ObtenerCursos() {
        List<Curso> listaCursos = null;
        Session session = sessionFactory.getCurrentSession();
        try {
            // Consulta todos los cursos usando HQL
            listaCursos = session.createQuery("from Curso", Curso.class).getResultList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return listaCursos;
    }

    /**
     * Obtiene un curso específico según su identificador.
     *
     * @param id El ID del curso que se desea recuperar.
     * @return El objeto Curso correspondiente al ID o null si no se encuentra.
     */
    @Override
    @Transactional
    public Curso ObtenerCurso(int id) {
        Session session = sessionFactory.getCurrentSession();
        Curso curso = null;
        try {
            // Recupera el curso mediante su ID
            curso = session.get(Curso.class, id);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return curso;
    }

    /**
     * Elimina un curso de la base de datos.
     *
     * @param curso El objeto Curso que se desea eliminar.
     */
    @Override
    @Transactional
    public void borrarCurso(Curso curso) {
        Session session = sessionFactory.getCurrentSession();
        try {
            // Elimina el curso indicado
            session.delete(curso);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Busca cursos según el tipo de búsqueda (por nombre o escuela).
     *
     * @param tipo  Tipo de búsqueda: "nombre" o "escuela".
     * @param valor Valor a buscar.
     * @return Lista de cursos que coinciden con los criterios de búsqueda.
     */
    @Override
    @Transactional
    public List<Curso> ObtenerCursosBuscar(String tipo, String valor) {
        List<Curso> listaCursos = null;
        Session session = sessionFactory.getCurrentSession();

        try {
            switch (tipo) {
                case "nombre": {
                    // Busca cursos cuyo nombre comience con el valor proporcionado
                    listaCursos = session.createQuery("from Curso where nombre like :valor", Curso.class)
                            .setParameter("valor", valor + "%")
                            .getResultList();
                    break;
                }
                case "escuela": {
                    // Busca cursos por nombre de la escuela asociada
                    listaCursos = session.createQuery("from Curso where escuela.nombre like :valor", Curso.class)
                            .setParameter("valor", valor + "%")
                            .getResultList();
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return listaCursos;
    }
}
