<?php

use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Schedule;

Artisan::command('inspire', function () {
    $this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');

/*
|--------------------------------------------------------------------------
| Tareas programadas
|--------------------------------------------------------------------------
|
| Requiere que el servidor tenga el planificador de Laravel corriendo:
|
|   * * * * * cd /ruta/al/manager && php artisan schedule:run >> /dev/null 2>&1
|
| Sin esa línea en el cron, nada de esto se ejecuta. Es la trampa habitual: el
| código está bien y no pasa nada porque nadie llama al planificador.
|
*/

// El resumen de bloqueos se comprueba CADA HORA y el comando decide dentro si le
// toca, comparando con la hora configurada en el panel. Así, cambiar la hora en
// Configuraciones → Configuraciones del Manager tiene efecto sin redesplegar.
Schedule::command('api-blocks:digest')
    ->hourly()
    ->withoutOverlapping()
    ->description('Resumen diario de bloqueos de la API (a la hora configurada en el panel)');

// Licencias que caducan: avisa con antelación y desactiva las que ya han caducado.
// Una vez al día es suficiente —una caducidad no es urgente al minuto— y a las 7:00
// para que el aviso esté en el buzón al empezar la jornada.
Schedule::command('licences:check-expiry')
    ->dailyAt('07:00')
    ->withoutOverlapping()
    ->description('Avisa de licencias por caducar y desactiva las caducadas');

// Limpieza del log de la API. Los días los decide el panel (`--retention`), no esta
// línea: si estuvieran aquí, cambiar la retención obligaría a redesplegar. Mientras
// nadie configure una retención, la tarea se ejecuta y no borra nada.
//
// A las 03:30 porque el borrado va por lotes sobre la tabla en la que la API escribe:
// a esa hora los entornos Moodle no están sincronizando.
Schedule::command('api-logs:purge --retention')
    ->dailyAt('03:30')
    ->withoutOverlapping()
    ->description('Borra los logs de la API más antiguos que la retención configurada');

// Soportes de entorno que caducan. Avisa a los umbrales configurados (30/15/7/0 días por
// defecto, como el `support:expires` del Manager antiguo) y NO toca datos: un soporte es
// un acuerdo comercial y caducar no corta el servicio.
//
// A las 07:15, justo después de las licencias: los dos avisos son de la misma gente y
// así llegan juntos al buzón en vez de repartidos por la mañana.
Schedule::command('supports:check-expiry')
    ->dailyAt('07:15')
    ->withoutOverlapping()
    ->description('Avisa de los soportes de entorno que están por caducar');

// Limpieza del registro de cortes: episodios cerrados y ventanas del limitador. Los días
// los decide el panel (`--retention`), igual que la limpieza del log de la API, y un corte
// activo no se borra nunca por mucha antigüedad que tenga.
//
// A las 03:45, después del log de la API: las dos van por lotes y no conviene que se pisen
// escribiendo a la vez sobre tablas que la API está usando.
Schedule::command('api-blocks:purge --retention')
    ->dailyAt('03:45')
    ->withoutOverlapping()
    ->description('Borra episodios de corte cerrados y ventanas del limitador según la retención configurada');
