Files
Laucha1312 90c5f85512 2
2026-06-04 15:15:23 -03:00

222 lines
6.8 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
use Barryvdh\DomPDF\Facade\Pdf;
class DocumentacionController extends Controller
{
public function index()
{
$path = base_path('misc/MANUAL_USUARIO.md');
$content = "No se encontró el manual.";
if (File::exists($path)) {
$md = File::get($path);
// Detectar rol de la sesión
$role = $this->getUserRole();
// Segmentar contenido
$filteredMd = $this->segmentMarkdown($md, $role);
$parsedown = new \Parsedown();
$content = $parsedown->text($filteredMd);
}
return view('documentacion.index', compact('content'));
}
/**
* Detecta el rol del usuario basado en las variables de sesión
*/
private function getUserRole()
{
if (session()->get('admin_logged_in')) {
$adminRole = session()->get('admin_role');
return ($adminRole == 1) ? 'superadmin' : 'admin_club';
}
if (session()->get('user_logged_in')) {
return session()->get('user_tipo'); // 'jugador' o 'aficionado'
}
return 'visitante';
}
/**
* Segmenta y filtra el Markdown según el rol
*/
private function segmentMarkdown($md, $role)
{
$markers = [
'cap1' => '<a name="cap1"></a>',
'cap2' => '<a name="cap2"></a>',
'cap3' => '<a name="cap3"></a>',
'cap4' => '<a name="cap4"></a>',
'cap5' => '<a name="cap5"></a>',
'faq' => '## ❓ Preguntas Frecuentes'
];
// Encontrar posiciones de los marcadores
$positions = [];
foreach ($markers as $key => $marker) {
$pos = strpos($md, $marker);
if ($pos !== false) {
$positions[$key] = $pos;
}
}
asort($positions);
$keys = array_keys($positions);
$sections = [];
// Intro (antes del primer capítulo)
$sections['intro'] = substr($md, 0, $positions[$keys[0]]);
// Capítulos y FAQ
for ($i = 0; $i < count($keys); $i++) {
$start = $positions[$keys[$i]];
$end = isset($keys[$i+1]) ? $positions[$keys[$i+1]] : strlen($md);
$sections[$keys[$i]] = substr($md, $start, $end - $start);
}
// Determinar qué capítulos mostrar
$allowedChapters = [1]; // Todos ven el Cap 1
$showSections = ['intro', 'cap1', 'faq'];
switch ($role) {
case 'superadmin':
$allowedChapters = [1, 2, 3, 4, 5];
$showSections = ['intro', 'cap1', 'cap2', 'cap3', 'cap4', 'cap5', 'faq'];
break;
case 'admin_club':
$allowedChapters = [1, 4];
$showSections = ['intro', 'cap1', 'cap4', 'faq'];
break;
case 'jugador':
$allowedChapters = [1, 2];
$showSections = ['intro', 'cap1', 'cap2', 'faq'];
break;
case 'aficionado':
$allowedChapters = [1, 3];
$showSections = ['intro', 'cap1', 'cap3', 'faq'];
break;
default: // visitante
$allowedChapters = [1];
$showSections = ['intro', 'cap1', 'faq'];
break;
}
// Filtrar Tabla de Contenidos en la Intro
$sections['intro'] = $this->filterTOC($sections['intro'], $allowedChapters);
// Unir secciones seleccionadas
$finalMd = "";
foreach ($showSections as $s) {
if (isset($sections[$s])) {
$finalMd .= $sections[$s] . "\n\n---\n\n";
}
}
return $finalMd;
}
/**
* Filtra la tabla de contenidos para mostrar solo los capítulos permitidos
*/
private function filterTOC($intro, $allowedChapters)
{
$lines = explode("\n", $intro);
$filteredLines = [];
$inTable = false;
foreach ($lines as $line) {
if (strpos($line, '| Capítulo | Perfil |') !== false) {
$inTable = true;
$filteredLines[] = $line;
continue;
}
if ($inTable) {
if (trim($line) === '' || (strpos($line, '|') === false && trim($line) !== '')) {
$inTable = false;
$filteredLines[] = $line;
continue;
}
if (strpos($line, '|---|') !== false) {
$filteredLines[] = $line;
continue;
}
// Filtrar fila de la tabla
$matched = false;
foreach ($allowedChapters as $cap) {
if (strpos($line, "[Capítulo $cap]") !== false) {
$matched = true;
break;
}
}
if ($matched) {
$filteredLines[] = $line;
}
} else {
$filteredLines[] = $line;
}
}
return implode("\n", $filteredLines);
}
public function download()
{
$path = base_path('misc/MANUAL_USUARIO.md');
if (!File::exists($path)) {
abort(404, 'No se pudo generar el manual porque el archivo base no existe.');
}
$md = File::get($path);
// Detectar rol de la sesión
$role = $this->getUserRole();
// Segmentar contenido
$filteredMd = $this->segmentMarkdown($md, $role);
// Convertir Markdown a HTML
$parsedown = new \Parsedown();
$htmlContent = $parsedown->text($filteredMd);
// Preparar Logo en Base64 para el PDF
$logoBase64 = null;
$logoPath = public_path('logo.png');
if (File::exists($logoPath)) {
$type = pathinfo($logoPath, PATHINFO_EXTENSION);
$data = File::get($logoPath);
$logoBase64 = 'data:image/' . $type . ';base64,' . base64_encode($data);
}
// Depuración temporal: Descomenta si querés ver qué rol detecta antes de generar el PDF
// dd('Rol detectado: ' . $role);
// Generar PDF con dompdf
$pdf = Pdf::loadView('documentacion.pdf', [
'content' => $htmlContent,
'logo' => $logoBase64
]);
// Ajustar papel y orientación
$pdf->setPaper('A4', 'portrait');
// Nombre de archivo único para evitar caché de navegador
$filename = 'Manual_Segmentado_' . $role . '_' . time() . '.pdf';
return $pdf->download($filename);
}
}