arcos-backend/app/Services/ArcoSimuladorService.php

74 lines
1.9 KiB
PHP

<?php
namespace App\Services;
use App\Models\VehicleFake;
use App\Models\Detection;
use Illuminate\Support\Facades\Log;
class ArcoSimuladorService
{
public function simularPasoVehiculo(): array
{
$vehiculo = VehicleFake::inRandomOrder()->first();
if (!$vehiculo) {
return [
'success' => false,
'message' => 'No hay vehículos disponibles para simular'
];
}
$epc = $this->generarEPC($vehiculo->vin);
Detection::create([
'epc' => $epc,
'vin' => $vehiculo->vin,
'placa' => $vehiculo->placa,
'marca' => $vehiculo->marca,
'modelo' => $vehiculo->modelo,
'color' => $vehiculo->color,
'fecha_deteccion' => now()
]);
return [
'success' => true,
'vehiculo' => [
'placa' => $vehiculo->placa,
'vin' => $vehiculo->vin,
'marca' => $vehiculo->marca,
'modelo' => $vehiculo->modelo,
'color' => $vehiculo->color,
'epc' => $epc
],
'mensaje' => 'Detección registrada localmente'
];
}
public function iniciarSimulacionContinua(int $minSegundos = 5, int $maxSegundos = 30): void
{
while (true) {
$this->simularPasoVehiculo();
$espera = rand($minSegundos, $maxSegundos);
Log::info("Esperando {$espera} segundos para próxima simulación...");
sleep($espera);
}
}
private function generarEPC(string $vin): string
{
$prefijo = 'E280117000000';
$sufijo = substr(strtoupper($vin), -8);
$relleno = str_pad($sufijo, 11, '0', STR_PAD_LEFT);
return $prefijo . $relleno;
}
public function obtenerTiempoAleatorio(int $min = 5, int $max = 30): int
{
return rand($min, $max);
}
}