package es.tatvil.taiageweb.controlador;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * API REST que sirve los ficheros Markdown del temario.
 *
 * <p>Todos los recursos están bajo {@code /api/temas/**} y requieren
 * autenticación con {@code ROLE_PAGADO} o {@code ROLE_ADMIN} (configurado en
 * {@link es.tatvil.taiageweb.config.SecurityConfig}).</p>
 *
 * <p>Los ficheros se leen desde el classpath en {@code temas/} y se devuelven
 * como texto plano UTF-8. Se protege contra ataques de <em>path traversal</em>
 * rechazando rutas que contengan {@code ..} o {@code //}.</p>
 */
@RestController
@RequestMapping("/api/temas")
public class TemaController {

    /**
     * Devuelve el contenido Markdown de un tema dado su ruta relativa.
     *
     * <p>Ejemplo de petición: {@code GET /api/temas/bloque1/tema1.md}</p>
     *
     * @param request petición HTTP de la que se extrae la ruta del recurso
     * @return {@code 200 OK} con el contenido Markdown como texto plano,
     *         {@code 400 Bad Request} si la ruta es inválida,
     *         {@code 404 Not Found} si el fichero no existe
     * @throws IOException si ocurre un error leyendo el recurso del classpath
     */
    @GetMapping("/**")
    public ResponseEntity<String> getTema(HttpServletRequest request) throws IOException {
        String uri = request.getRequestURI();
        String path = uri.substring("/api/temas/".length());

        // Prevenir path traversal
        if (path.contains("..") || path.contains("//") || path.startsWith("/")) {
            return ResponseEntity.badRequest().build();
        }

        ClassPathResource resource = new ClassPathResource("temas/" + path);
        if (!resource.exists()) {
            return ResponseEntity.notFound().build();
        }

        String content = new String(resource.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
        return ResponseEntity.ok()
                .contentType(new MediaType("text", "plain", StandardCharsets.UTF_8))
                .body(content);
    }
}
