package es.pulsoft.controlador;

import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import es.pulsoft.controlador.dto.CursoBusqueda;
import es.pulsoft.controlador.entity.Curso;
import es.pulsoft.controlador.entity.Escuela;
import es.pulsoft.dao.CursoDao;
import es.pulsoft.dao.EscuelaDao;

/**
 * Controlador Spring MVC para gestionar las operaciones relacionadas con cursos.
 * Mapea todas las URLs bajo el path "/Curso".
 */
@Controller
@RequestMapping("/Curso")
public class CursoControlador {

    @Autowired
    private EscuelaDao escuelaDao;
    
    @Autowired
    private CursoDao cursoDao;
    
    /**
     * Muestra el formulario para agregar un nuevo curso.
     * 
     * @param curso Objeto Curso que se bindea al formulario
     * @param modo Indica el modo de operación (ej: "agregar", "editar")
     * @param modelo Modelo para pasar datos a la vista
     * @return Vista "curso/agregarCurso"
     */
    @GetMapping("/agregarCurso")
    public String agregarCurso(
            @ModelAttribute("curso") Curso curso,
            @RequestParam("modo") String modo,
            Model modelo) {
        
        modelo.addAttribute("modo", modo);
        
        List<Escuela> listaEscuelas = escuelaDao.obternerEscuelas();
        modelo.addAttribute("listaEscuelas", listaEscuelas);
        
        return "curso/agregarCurso";
    }
    
    /**
     * Procesa el formulario para insertar un nuevo curso.
     * 
     * @param session Sesión HTTP para almacenar mensajes flash
     * @param curso Objeto Curso con los datos del formulario
     * @return Redirección a la página principal
     */
    @PostMapping("/agregarCurso")
    public String insertarCurso(
            HttpSession session,
            @ModelAttribute("curso") Curso curso) {
        
        try {
            cursoDao.insertarCurso(curso);
            session.setAttribute("mensaje", "Operacion de insertar curso realizada con exito");
        } catch(Exception e) {
            session.setAttribute("error", "Operacion de insertar curso fallida");
        }
        
        return "redirect:/";
    }
    
    /**
     * Muestra la lista de todos los cursos disponibles.
     * 
     * @param modo Indica el modo de operación
     * @param modelo Modelo para pasar datos a la vista
     * @param session Sesión HTTP para manejar mensajes
     * @return Vista "curso/mostrarCurso"
     */
    @GetMapping("/mostrarCurso")
    public String mostrarLista(
            String modo,
            Model modelo,
            HttpSession session) {
        
        List<Curso> listaCursos = null;
        
        try {
            listaCursos = cursoDao.ObtenerCursos();
            modelo.addAttribute("listaCursos", listaCursos);
            modelo.addAttribute("modo", modo);
            modelo.addAttribute("mensaje","Hay un total de " + listaCursos.size() + " cursos disponibles");
            CursoBusqueda cursoBusqueda = new CursoBusqueda();
            modelo.addAttribute("cursoBusqueda", cursoBusqueda);
            session.removeAttribute("mensaje");
            session.removeAttribute("error");
        } catch(Exception e) {
            modelo.addAttribute("error","Error al listar los cursos");
        }
        return "curso/mostrarCurso";
    }
    
    /**
     * Prepara el formulario para actualizar un curso existente.
     * 
     * @param id ID del curso a actualizar
     * @param modo Modo de operación (debería ser "actualizar")
     * @param escuelaId ID de la escuela asociada (no se usa directamente)
     * @param modelo Modelo para pasar datos a la vista
     * @return Vista "curso/agregarCurso" (reutiliza el formulario de agregar)
     */
    @GetMapping("/actualizar")
    public String actualizar(
            @RequestParam("id") int id,
            String modo,
            @RequestParam("escuelaId") int escuelaId,
            Model modelo) {
        
        Curso curso = cursoDao.ObtenerCurso(id);
        List<Escuela> listaEscuelas = escuelaDao.obternerEscuelas();
        modelo.addAttribute("curso", curso);
        modelo.addAttribute("listaEscuelas", listaEscuelas);
        modelo.addAttribute("modo", modo);
        return "curso/agregarCurso";
    }
    
    /**
     * Elimina un curso de la base de datos.
     * 
     * @param curso Objeto Curso a eliminar
     * @param modelo Modelo para pasar datos
     * @param session Sesión HTTP para mensajes flash
     * @return Redirección a la vista de listado de cursos
     */
    @GetMapping("borrar")
    public String borrar(
            @ModelAttribute("curso") Curso curso,
            Model modelo,
            HttpSession session) {
        
        try {
            cursoDao.borrarCurso(curso);
            session.setAttribute("mensaje", "Curso borrado con exito");
            
            return "redirect:/Curso/mostrarCurso?modo=borrar";
        } catch(Exception e) {
            session.setAttribute("error", "Error al borrar el curso de la BBDD");
            return "redirect:/Curso/mostrarCurso?modo=borrar";
        }
    }
    
    /**
     * Busca cursos según los criterios especificados.
     * 
     * @param cursoBusqueda DTO con los parámetros de búsqueda
     * @param session Sesión HTTP
     * @param modelo Modelo para pasar datos a la vista
     * @param modo Modo de operación
     * @return Vista "curso/mostrarCurso" con los resultados
     */
    @RequestMapping("/buscar")
    public String buscarCurso(
            @ModelAttribute("cursoBusqueda") CursoBusqueda cursoBusqueda,
            HttpSession session,
            Model modelo,
            @RequestParam("modo") String modo) {
        
        String tipo = cursoBusqueda.getTipoBusqueda();
        String valor = cursoBusqueda.getValor();
        List<Curso> listaCursos = null;
        
        try {
            listaCursos = cursoDao.ObtenerCursosBuscar(tipo, valor);
            modelo.addAttribute("listaCursos", listaCursos);
            modelo.addAttribute("mensaje", "Un total de " + listaCursos.size() + " coinciden con tu busqueda");
        } catch(Exception e) {
            listaCursos = cursoDao.ObtenerCursos();
            modelo.addAttribute("listaCursos", listaCursos);
            modelo.addAttribute("error", "Error al buscar cursos");
        }
        
        return "curso/mostrarCurso";
    }
}