<?php

/**
 * SmarterASP / IIS sin SSH ni cron Linux: ejecutar el programador de Laravel vía HTTP.
 *
 * El scheduler de Laravel (recordatorios WhatsApp, resúmenes, etc.) necesita que alguien
 * llame a `php artisan schedule:run` **cada minuto**. En hosting sin cron, usá un servicio
 * gratuito (p. ej. cron-job.org, EasyCron) que abra esta URL cada minuto.
 *
 * 1. En el `.env` del servidor agregá una clave larga (puede ser la misma idea que MIGRATE_ONCE_KEY):
 *    WEB_SCHEDULE_KEY=tu-secreto-muy-largo-aleatorio
 *
 * 2. Subí este archivo como `schedule-run.php` al **root de Laravel** (junto a `artisan`)
 *    o a `public/schedule-run.php` si el hosting solo ejecuta PHP ahí.
 *
 * 3. Probá en el navegador (una vez):
 *    https://TU-DOMINIO/schedule-run.php?key=tu-secreto-muy-largo-aleatorio
 *
 *    Deberías ver texto plano con la salida de `schedule:run` (a veces vacía si no tocaba tarea).
 *
 * 4. En cron-job.org (u otro): nueva tarea GET a esa URL **cada minuto** (* * * * *).
 *
 * 5. No borres el archivo si dependés del cron externo; si lo movés, actualizá la URL en el servicio.
 *
 * Seguridad: mantené la clave en secreto; cualquiera con la URL completa puede disparar tareas.
 */

declare(strict_types=1);

header('Content-Type: text/plain; charset=utf-8');

$keyFromUrl = (string) ($_GET['key'] ?? '');

function resolveBaseDir(string $startDir): ?string
{
    $dir = realpath($startDir) ?: $startDir;
    for ($i = 0; $i < 6; $i++) {
        $bootstrap = $dir . DIRECTORY_SEPARATOR . 'bootstrap' . DIRECTORY_SEPARATOR . 'app.php';
        $autoload = $dir . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
        if (is_file($bootstrap) && is_file($autoload)) {
            return $dir;
        }
        $parent = dirname($dir);
        if ($parent === $dir) {
            break;
        }
        $dir = $parent;
    }

    return null;
}

function readEnvKey(string $envPath, string $prefix): ?string
{
    if (! is_readable($envPath)) {
        return null;
    }
    $lines = file($envPath, FILE_IGNORE_NEW_LINES);
    if ($lines === false) {
        return null;
    }
    foreach ($lines as $line) {
        $line = trim($line);
        if ($line === '' || str_starts_with($line, '#')) {
            continue;
        }
        if (str_starts_with($line, $prefix)) {
            return trim(substr($line, strlen($prefix)), " \t\"'");
        }
    }

    return null;
}

$baseDir = resolveBaseDir(__DIR__);
if (! $baseDir) {
    http_response_code(500);
    exit("Could not resolve Laravel base directory.\n");
}

require $baseDir . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
$app = require_once $baseDir . DIRECTORY_SEPARATOR . 'bootstrap' . DIRECTORY_SEPARATOR . 'app.php';

/** @var \Illuminate\Contracts\Console\Kernel $kernel */
$kernel = $app->make(\Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();

$envFile = $baseDir . DIRECTORY_SEPARATOR . '.env';
$expectedKey = (string) (
    getenv('WEB_SCHEDULE_KEY')
    ?: ($_ENV['WEB_SCHEDULE_KEY'] ?? '')
    ?: ($_SERVER['WEB_SCHEDULE_KEY'] ?? '')
);
if ($expectedKey === '') {
    $expectedKey = (string) (readEnvKey($envFile, 'WEB_SCHEDULE_KEY=') ?? '');
}
if ($expectedKey === '') {
    $expectedKey = (string) (
        getenv('MIGRATE_ONCE_KEY')
        ?: ($_ENV['MIGRATE_ONCE_KEY'] ?? '')
        ?: ($_SERVER['MIGRATE_ONCE_KEY'] ?? '')
    );
}
if ($expectedKey === '') {
    $expectedKey = (string) (readEnvKey($envFile, 'MIGRATE_ONCE_KEY=') ?? '');
}

if ($expectedKey === '') {
    http_response_code(403);
    exit("Set WEB_SCHEDULE_KEY (or MIGRATE_ONCE_KEY) in .env first.\n");
}

if (! hash_equals($expectedKey, $keyFromUrl)) {
    http_response_code(403);
    exit("Forbidden\n");
}

try {
    $kernel->call('schedule:run');
    echo $kernel->output();
    if ($kernel->output() === '') {
        echo "OK — schedule:run completed (no output; tasks run only when due).\n";
    }
} catch (Throwable $e) {
    http_response_code(500);
    echo $e->getMessage() . "\n" . $e->getTraceAsString();
}
