<?php
require_once __DIR__ . '/../vendor/autoload.php';

use App\Services\RotationService;
use App\Config\Env;
use App\Config\Database;

// Configuración
Env::load();
date_default_timezone_set(Env::get('TIMEZONE', 'UTC'));

echo "[" . date('Y-m-d H:i:s') . "] Iniciando Worker de Rotación...\n";

// Bucle infinito
while (true) {
    try {
        $now = new DateTime();
        
        // Ejecutar cada sábado a las 23:00 (o la hora que prefieras)
        // Lógica: Si es Sábado (w=6) y hora 23
        if ($now->format('w') == 6 && $now->format('H') == 23) {
            
            echo "[" . date('Y-m-d H:i:s') . "] Ejecutando generación semanal...\n";
            
            // Verificar conexión a DB antes de procesar (reconexión si es necesario)
            // PDO suele manejar timeouts, pero en workers de larga duración es mejor verificar
            // App\Config\Database es Singleton, así que la instancia persiste.
            // Una estrategia simple es dejar que el script muera y Supervisor lo reinicie, 
            // pero lo haremos robusto instanciando servicios frescos en el loop si fuera necesario.
            
            $service = new RotationService();
            // Aseguramos que siempre haya al menos 8 semanas futuras.
            // Si ya existen, generateNext no duplica, solo agrega si faltan.
            $count = $service->generateNext(8);
            
            echo "[" . date('Y-m-d H:i:s') . "] Generadas $count nuevas semanas.\n";
            
            // Dormir 1h para asegurar que pase la hora 23 y no repita
            sleep(3600);
        } else {
            // Dormir 60 segundos antes de volver a verificar
            // echo "."; // Keepalive log
        }
        
    } catch (Exception $e) {
        echo "[" . date('Y-m-d H:i:s') . "] ERROR CRÍTICO: " . $e->getMessage() . "\n";
        // Esperar un poco antes de reintentar para no saturar logs
        sleep(60);
    }
    
    sleep(60);
}
