<?php
namespace App\Service;
use DateTime;
class AgendaService
{
/**
* @throws \JsonException
*/
public function parseAgendaEvents(mixed $events, mixed $query_date = null, mixed $query_date2 = null, bool $isAgenda = false): mixed
{
$current_date = $query_date ?? new DateTime();
$to_unset = [];
$i = 0;
foreach ($events as $event) {
if ($event['json'] !== null) {
$json_horaires = json_decode($event['json'], true, 512, JSON_THROW_ON_ERROR);
if ($json_horaires['modeDates'] === 'multiple') {
$to_unset[] = $i;
if ($json_horaires['datesMultiple']['modeHours'] === 'simple') {
$date = null;
foreach ($json_horaires['datesMultiple']['dates'] as $date) {
$start_date = date_create_from_format('d/m/Y', $date);
if ($query_date2 === null) {
if ($start_date >= $current_date) {
$new_event = $event;
$new_event['date_time_debut'] = $start_date;
$new_event['date_debut'] = $start_date->format('d/m/Y');
$new_event['date_fin'] = $start_date->format('d/m/Y');
$events[] = $new_event;
}
} else
if (($query_date !== null) && $query_date <= $start_date && $start_date <= $query_date2) {
$new_event = $event;
$new_event['date_time_debut'] = $start_date;
$new_event['date_debut'] = $start_date->format('d/m/Y');
$new_event['date_fin'] = $start_date->format('d/m/Y');
$events[] = $new_event;
}
}
} else if ($json_horaires['datesMultiple']['modeHours'] === 'details') {
$hoursDetails = $json_horaires['datesMultiple']['hoursDetails'];
foreach ($hoursDetails as $hour) {
$start_date = date_create_from_format('d/m/Y', $hour['date']);
if ($start_date >= $current_date) {
$new_event = $event;
$new_event['date_time_debut'] = $start_date;
$new_event['date_debut'] = $start_date->format('d/m/Y');
$new_event['date_fin'] = $start_date->format('d/m/Y');
$events[] = $new_event;
}
}
}
}
} else {
$event['date_time_debut'] = date_create_from_format('d/m/Y', $event['date_debut']);
}
$i++;
}
$to_unset = array_reverse($to_unset);
foreach ($to_unset as $i_) {
unset($events[$i_]);
}
if ($isAgenda === true) {
usort(
$events,
static function ($x, $y) {
$x_is_datetime = $x['date_time_debut'] instanceof DateTime;
$y_is_datetime = $y['date_time_debut'] instanceof DateTime;
if (!$x_is_datetime && !$y_is_datetime) {
return 0; // Maintain original order if both are invalid
}
if (!$x_is_datetime) {
return 1; // Put invalid dates at the end
}
if (!$y_is_datetime) {
return -1; // Put invalid dates at the end
}
return $x['date_time_debut']->getTimestamp() > $y['date_time_debut']->getTimestamp();
}
);
} else {
usort(
$events,
static function ($x, $y) {
$x_is_datetime = $x['date_time_debut'] instanceof DateTime;
$y_is_datetime = $y['date_time_debut'] instanceof DateTime;
if (!$x_is_datetime && !$y_is_datetime) {
return 0; // Maintain original order if both are invalid
}
if (!$x_is_datetime) {
return 1; // Put invalid dates at the end
}
if (!$y_is_datetime) {
return -1; // Put invalid dates at the end
}
return $x['date_time_debut']->getTimestamp() < $y['date_time_debut']->getTimestamp();
}
);
}
return $events;
}
}