<?php
/**
 * ScheduleRegistry — source unique des tâches planifiées (batchs).
 *
 * Agrège :
 *   - les jobs « cœur » (toujours présents) : logrotate, backup, schedule_reports ;
 *   - les jobs déclarés par chaque module ACTIF dans
 *     mon-appli/modules/<name>/exploitation/scheduler.php (qui retourne un tableau
 *     de descripteurs de jobs).
 *
 * Consommée par exploitation/core/schedule.php (génération crontab/schtasks) et
 * par mon-appli/admin/batch.php (page d'administration des batchs).
 *
 * Schéma d'un job : [
 *   'key'    => string,   // identifiant (clé i18n batch.job_<key>)
 *   'cron'   => string,   // expression cron (Linux)
 *   'script' => string,   // chemin relatif à ROOT_PATH
 *   'args'   => string,   // arguments CLI
 *   'task'   => string,   // nom de tâche Windows (schtasks)
 *   'win_sc' => string,   // /sc … (schtasks)
 *   'win_st' => string,   // /st HH:MM (schtasks)
 * ]
 */
class ScheduleRegistry
{
    /** Jobs cœur, indépendants des modules. */
    public static function coreJobs(): array
    {
        return [
            ['key' => 'logrotate',        'cron' => '5 0 * * *',  'script' => 'exploitation/core/logrotate.php',        'args' => '--keep 8 --quiet', 'task' => 'SwApp_LogRotate',       'win_sc' => 'daily', 'win_st' => '00:05'],
            ['key' => 'backup',           'cron' => '0 2 * * *',  'script' => 'exploitation/core/backup.php',           'args' => '--keep 8 --quiet', 'task' => 'SwApp_Backup',          'win_sc' => 'daily', 'win_st' => '02:00'],
            ['key' => 'schedule_reports', 'cron' => '5 0 * * *',  'script' => 'exploitation/core/schedule_reports.php', 'args' => '--quiet',          'task' => 'SwApp_ScheduleReports', 'win_sc' => 'daily', 'win_st' => '00:05'],
        ];
    }

    /**
     * Liste complète des jobs : cœur + modules actifs, restreinte aux scripts
     * réellement présents sur ce déploiement.
     *
     * @param Module $registry Registre des modules (pour l'état actif).
     */
    public static function jobs(Module $registry): array
    {
        $jobs = self::coreJobs();

        // Découverte par glob : le nom de dossier (CMDB/CNP) peut différer du
        // nom enregistré (cmdb/cnp) — on teste l'état actif sur les deux casses.
        foreach (glob(WEBROOT_PATH . '/modules/*/exploitation/scheduler.php') ?: [] as $file) {
            $dir = basename(dirname(dirname($file)));   // ex. CMDB, oracle
            if (!$registry->isActive($dir) && !$registry->isActive(strtolower($dir))) continue;
            $modJobs = require $file;
            if (!is_array($modJobs)) continue;
            foreach ($modJobs as $j) {
                if (is_array($j) && !empty($j['key']) && !empty($j['script'])) {
                    $jobs[] = $j;
                }
            }
        }

        // Tolérance : n'ordonnancer que les scripts présents (module non packagé,
        // déploiement partiel…).
        return array_values(array_filter(
            $jobs,
            fn($j) => is_file(ROOT_PATH . '/' . $j['script'])
        ));
    }
}
