package es.tatvil.taiageweb.controlador;

import es.tatvil.taiageweb.servicio.UsuarioService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 * Controlador MVC para el panel de administración de usuarios.
 *
 * <p>Todas las rutas bajo {@code /admin} requieren {@code ROLE_ADMIN}
 * (configurado en {@link es.tatvil.taiageweb.config.SecurityConfig}).
 * Permite listar, habilitar/deshabilitar, asignar acceso de pago,
 * crear y eliminar usuarios.</p>
 */
@Controller
@RequestMapping("/admin")
public class AdminController {

    private final UsuarioService service;

    /**
     * Constructor con inyección de dependencias.
     *
     * @param service servicio de gestión de usuarios
     */
    public AdminController(UsuarioService service) {
        this.service = service;
    }

    /**
     * Lista todos los usuarios registrados.
     *
     * @param model modelo Thymeleaf al que se añade el atributo {@code usuarios}
     * @return nombre de la plantilla {@code admin/usuarios}
     */
    @GetMapping({"", "/", "/usuarios"})
    public String listar(Model model) {
        model.addAttribute("usuarios", service.listarTodos());
        return "admin/usuarios";
    }

    /**
     * Activa o desactiva la cuenta del usuario indicado.
     *
     * @param id identificador del usuario
     * @return redirección a {@code /admin/usuarios}
     */
    @PostMapping("/usuarios/{id}/toggle-habilitado")
    public String toggleHabilitado(@PathVariable Long id) {
        service.toggleHabilitado(id);
        return "redirect:/admin/usuarios";
    }

    /**
     * Concede o revoca el acceso al curso ({@code ROLE_PAGADO}) del usuario indicado.
     *
     * @param id identificador del usuario
     * @return redirección a {@code /admin/usuarios}
     */
    @PostMapping("/usuarios/{id}/toggle-pagado")
    public String togglePagado(@PathVariable Long id) {
        service.toggleRolPagado(id);
        return "redirect:/admin/usuarios";
    }

    /**
     * Crea un usuario directamente activo desde el panel de administración.
     *
     * @param email    email del nuevo usuario
     * @param password contraseña en texto plano
     * @param pagado   si {@code true}, se asigna {@code ROLE_PAGADO} además de {@code ROLE_USER}
     * @param ra       atributos flash para mensajes de error entre redirecciones
     * @return redirección a {@code /admin/usuarios}
     */
    @PostMapping("/usuarios/nuevo")
    public String crear(
            @RequestParam String email,
            @RequestParam String password,
            @RequestParam(defaultValue = "false") boolean pagado,
            RedirectAttributes ra) {
        try {
            service.crearPorAdmin(email, password, pagado);
        } catch (IllegalArgumentException e) {
            ra.addFlashAttribute("error", e.getMessage());
        }
        return "redirect:/admin/usuarios";
    }

    /**
     * Elimina un usuario de la base de datos.
     *
     * @param id identificador del usuario a eliminar
     * @return redirección a {@code /admin/usuarios}
     */
    @PostMapping("/usuarios/{id}/eliminar")
    public String eliminar(@PathVariable Long id) {
        service.eliminar(id);
        return "redirect:/admin/usuarios";
    }
}
