<?php
namespace App\Controller\Home\courses;
use App\Exception\InvalidParameterException;
use App\Interfaces\ActividadFormativaRepositoryInterface;
use App\Interfaces\FormadorRepositoryInterface;
use App\Interfaces\GrupoRepositoryInterface;
use App\Services\Domain\CursoEstadoService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
/**
* Controlador para mostrar el detalle de una actividad formativa (solicitud o grupo)
*/
class DetailController extends AbstractController
{
public function __construct(
private ActividadFormativaRepositoryInterface $actividadesRepository,
private FormadorRepositoryInterface $formadorRepository,
private GrupoRepositoryInterface $grupoRepository,
private Security $security,
private CursoEstadoService $cursoEstadoService
) {
}
/**
* Muestra el detalle de una actividad formativa específica
*
* @Route("/{_locale}/courses/{tipo}/{id}", name="course_detail", defaults={"_locale" = "ca"}, requirements={"_locale": "es|ca", "tipo": "solicitud|grupo", "id": "\d+"})
*
* @param Request $request Objeto Request de Symfony
* @param string $tipo Tipo de actividad (solicitud o grupo)
* @param int $id ID de la actividad a mostrar
*
* @return Response
*
* @throws InvalidParameterException Si el ID no es válido
*/
public function __invoke(Request $request, string $tipo, int $id): Response
{
// Validar el ID de la actividad
if (!is_numeric($id) || (int)$id <= 0) {
throw new InvalidParameterException('ID de actividad no válido');
}
// Validar el tipo de actividad
if (!in_array($tipo, ['solicitud', 'grupo'])) {
throw new InvalidParameterException('Tipo de actividad no válido');
}
// Buscar la actividad por tipo e ID
$actividad = $this->actividadesRepository->findActividadById($tipo, $id);
if (!$actividad) {
throw $this->createNotFoundException('Actividad no encontrada');
}
// Determinar estado del curso
$estado = 'pendiente';
$estadoLabel = 'Pendiente';
$ahora = new \DateTime();
if ($tipo === 'grupo' && $actividad['fechaInicio'] && $actividad['fechaFinal']) {
if ($ahora >= $actividad['fechaInicio'] && $ahora <= $actividad['fechaFinal']) {
$estado = 'en_curso';
$estadoLabel = 'En curso';
} elseif ($ahora > $actividad['fechaFinal']) {
$estado = 'finalizado';
$estadoLabel = 'Finalizado';
}
}
// Añadir estado y estadoLabel al actividad
$actividad['estado'] = $estado;
$actividad['estadoLabel'] = $estadoLabel;
// Si el usuario está logueado y es un grupo, buscar detalles de su inscripción
$usuario = $this->security->getUser();
if ($usuario && $tipo === 'grupo') {
// Necesitamos la entidad Grupo completa para la búsqueda
$grupoEntity = $this->grupoRepository->findById($id);
if ($grupoEntity) {
$detallesInscripcion = $this->actividadesRepository->getDetallesInscripcionUsuario($usuario, $grupoEntity);
// Fusionar los detalles de la inscripción con los datos de la actividad
if (!empty($detallesInscripcion)) {
$actividad = array_merge($actividad, $detallesInscripcion);
}
// Obtener el estado definitivo del servicio de dominio
$estadoDefinitivo = $this->cursoEstadoService->obtenerEstadoCurso($grupoEntity, $usuario);
if ($estadoDefinitivo) {
$actividad['estado'] = $estadoDefinitivo->value;
$actividad['estadoLabel'] = $estadoDefinitivo->getLabel();
}
// Añadir estado de inscripción para prevenir múltiples inscripciones
$actividadesArray = [$actividad];
$this->actividadesRepository->addUserInscriptionStatus($actividadesArray);
$actividad = $actividadesArray[0];
}
}
// El formador ya viene incluido en la respuesta de findActividadById para grupos
// Para solicitudes siempre será null
// Usamos usort para ordenar el array por la clave 'dataHoraInici'
if(@$actividad['grupoSesiones'])usort($actividad['grupoSesiones'], function ($a, $b) {
// La función de comparación utiliza el operador <=> para comparar las fechas
// Devuelve -1 si $a < $b, 0 si son iguales, y 1 si $a > $b
return $a['dataHoraInici'] <=> $b['dataHoraInici'];
});
// Renderizar la plantilla con los datos de la actividad
return $this->render('home/courses/detail.html.twig', [
'actividad' => $actividad,
'tipo' => $tipo,
'sesiones' => $actividad['grupoSesiones'] ?? []
]);
}
}