#!/usr/bin/env php
<?php

/**
 * Prints the queue worker command for this tenant runtime.
 *
 * This script does not start a worker and does not install a service.
 * Local preparation uses QUEUE_CONNECTION=sync, which runs jobs in-process
 * and does not need a worker. Production should use the tenant database,
 * or Redis with a tenant-specific prefix, under one supervisor program per
 * tenant. The program must execute this tenant's Artisan entrypoint.
 * Do not call the shared release Artisan.
 */

$runtime = __DIR__;
$artisan = $runtime.'/artisan';

if (is_link($artisan) || ! is_file($artisan)) {
    fwrite(STDERR, "Tenant queue worker requires the tenant Artisan entrypoint.\n");
    exit(1);
}

$artisanReal = realpath($artisan);
$runtimeReal = realpath($runtime);

if ($artisanReal === false || $runtimeReal === false || dirname($artisanReal) !== $runtimeReal) {
    fwrite(STDERR, "Tenant queue worker requires the tenant Artisan entrypoint.\n");
    exit(1);
}

$releaseFile = $runtimeReal.'/release.php';

if (! is_file($releaseFile) || is_link($releaseFile)) {
    fwrite(STDERR, "Tenant runtime release is missing or invalid.\n");
    exit(1);
}

$release = require $releaseFile;
$releaseArtisan = is_string($release) ? realpath($release.'/artisan') : false;

if ($releaseArtisan !== false && $releaseArtisan === $artisanReal) {
    fwrite(STDERR, "Tenant queue worker must not use the shared release Artisan.\n");
    exit(1);
}

$tenant = basename($runtimeReal);

$plan = [
    'tenant' => $tenant,
    'artisan' => $artisanReal,
    'worker_name' => 'swiftpos-'.$tenant,
    'log' => $runtimeReal.'/storage/logs/queue-worker.log',
    'pid' => $runtimeReal.'/storage/framework/queue-worker.pid',
    'local_preparation_queue' => 'sync',
    'production_recommendation' => 'database-or-redis-with-tenant-prefix',
    'command' => [
        PHP_BINARY,
        $artisanReal,
        'queue:work',
        '--name=swiftpos-'.$tenant,
        '--sleep=3',
        '--tries=3',
        '--max-time=3600',
        '--no-interaction',
    ],
    'started' => false,
];

fwrite(STDOUT, json_encode($plan, JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR)."\n");
exit(0);
